Отладчик VS2017: не имеет адреса, возможно, из-за оптимизации компилятора

Кажется, не относится к некоторым вопросам с похожими заголовками.

//some other code
std::string s = Lookup->getName().str();
-> break here //some other code

Примечание. «Поиск» — это clang::DirectoryLookup http://clang.llvm.org/doxygen/ classclang

//some other code
std::string s = Lookup->getName().str();
-> break here //some other code
1DirectoryLookup.html, «Поиск->getName()» — это llvm::StringRef http:/ /llvm.org/doxygen/classllvm
//some other code
std::string s = Lookup->getName().str();
-> break here //some other code
1StringRef.html
.

При разрыве в указанном выше месте на панели «Наблюдение» в VS2017 строковая переменная «s» успешно инициализируется, и ее значение может отображаться на панели «Наблюдение».

Но когда вы пытаетесь показать (смотреть) выражение «Lookup->getName().str()», которое именно так инициализирует «s», оно говорит:

Lookup->getName().str() | Function llvm::StringRef::str has no address, possibly due to compiler optimizations. 

исходный код StringRef::str():

/// str - Get the contents as an std::string.
LLVM_NODISCARD
std::string str() const {
  if (!Data) return std::string();
  return std::string(Data, Length);
}

И все библиотеки в отладочной версии. Исходя из вышеизложенного, кажется, что для этого нет никаких причин.

Такое происходит и в других ситуациях во время отладки программы Clang Libtooling, и это очень усложняет отладку.

Какова возможная причина и как ее решить?


person jw_    schedule 12.01.2020    source источник
comment
См. эти, one, два. И, возможно, вы можете изменить использование статической библиотеки ссылок, а затем, если это неявно, вышеуказанный метод может нормально работать. Если это явно, вызов должен быть сделан с использованием сохраненного указателя функции.   -  person Mr Qian    schedule 14.01.2020


Ответы (3)


Я попробовал решение @user15331850, и это не помогло, но настройка Linker-> Debugging-> Generate Debug Info на /DEBUG:FULL, кажется, теперь дает мне все переменные.

person Rolandas Dundulis    schedule 31.03.2021
comment
Благодарить. Оно работает. Откуда ты знаешь ответ? Можете ли вы предоставить некоторые ссылки? - person cppBeginner; 01.07.2021
comment
Рад, что это помогло! Я нашел его случайно, но теперь вот ссылка, сообщающая, что /DEBUG:FULL принимает все символы из всех мест в один большой файл базы данных. Он тяжелый и медленный, но может показать все переменные. - person Rolandas Dundulis; 01.07.2021

Это может быть связано с тем, что опция оптимизации включена. Вы можете отключить то же самое, выполнив следующие действия:

  • Щелкните правой кнопкой мыши решение
  • Нажмите на «свойства»
  • На левой панели нажмите «Свойства конфигурации».
  • Нажмите «C/C++» в подопции.
  • Затем нажмите «оптимизация» и выберите «Отключено (/ Od)» из списка.

Вот и все. Надеюсь, это сработает для вас!

person Lohit Barki    schedule 12.01.2020
comment
Он уже отключен. В вопросе также упоминались другие факты о том, почему этого не должно происходить. - person jw_; 13.01.2020

У меня была эта проблема. Мне нужно было изменить настройки для: Linker-> Debugging-> Generate Debug Info с /DEBUG: FASTLINK на /DEBUG.

person user15331850    schedule 04.03.2021
comment
На меня это не действует :( - person cppBeginner; 01.07.2021