Lldb: Не удалось материализовать: не удалось получить значение переменной
Я скомпилировал файл cpp с этой командной строкой: g++ -g test.cpp
Он выдает исключение в строке 28. Я хочу исследовать причину, проверив переменные в lldb. Я установил точку прерывания в строке 28 и запустил a.out
в lldb.
(lldb) n
Process 84233 stopped
* thread #1: tid = 0xa44b86, 0x00000001000017fb a.out`say(s=<unavailable>) + 987 at so.cpp:28, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x00000001000017fb a.out`say(s=<unavailable>) + 987 at so.cpp:28
25 }
26 else{
27 s.insert(0, to_string(sz));
-> 28 s.erase(2, sz-1);
29 }
30 return s;
31 }
(lldb) po s
error: Couldn't materialize: couldn't get the value of variable s: variable not available
Errored out in Execute, couldn't PrepareToExecuteJITExpression
Почему сообщение об ошибке? Как проверить переменную s
?
версия lldb: lldb-320.4.115.3
версия g++: Configured with: --prefix=/Applications/Xcode6-Beta5.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.45.3) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
Ответы
Ответ 1
Эта ошибка означает, что информация об отладке упоминает эту переменную, но говорит, что на текущем ПК нет места хранения.
Это может быть связано с тем, что переменная была оптимизирована (маловероятно, что вы просто вызываете функцию для переменной) или потому, что компилятор сбросил информацию об отладке для переменной и потерял отслеживание того, куда она пошла.
Убедитесь, что вы компилируете код, который вы пытаетесь отлаживать, на -O0, поскольку не так много компиляторов, которые генерируют хорошую отладочную информацию на более высоких уровнях оптимизации. Если вы компилируете на -O0, это ошибка компилятора. Вероятно, вы должны сообщить об этом людям gcc. Вы могли бы видеть, есть ли у вас больше удачи с clang. В противном случае вам нужно прочитать сборку функции, чтобы выяснить, где находится фактическая переменная, а затем сообщить отладчику о том, чтобы напечатать соответствующий адрес.
Ответ 2
У меня была эта проблема, когда я включил "Address Sanitizer" из моей схемы приложений. Отключите его, исправив проблему.
Ответ 3
Я вижу это, когда я запускаю сборку RELEASE (vs DEBUG) (Product- > Scheme...- > Edit Scheme...- > Info, а затем задаю Build Configuration для "Debug".
Ответ 4
У меня была эта проблема при компиляции с флагом -Og
. Почему-то я думал, что это означает "оптимизировать для отладки". Я не думаю, что это так на самом деле. Снятие этого флага решило проблему для меня.