Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Эта ошибка означает, что информация об отладке упоминает эту переменную, но говорит, что на текущем ПК нет места хранения.

Это может быть связано с тем, что переменная была оптимизирована (маловероятно, что вы просто вызываете функцию для переменной) или потому, что компилятор сбросил информацию об отладке для переменной и потерял отслеживание того, куда она пошла.

Убедитесь, что вы компилируете код, который вы пытаетесь отлаживать, на -O0, поскольку не так много компиляторов, которые генерируют хорошую отладочную информацию на более высоких уровнях оптимизации. Если вы компилируете на -O0, это ошибка компилятора. Вероятно, вы должны сообщить об этом людям gcc. Вы могли бы видеть, есть ли у вас больше удачи с clang. В противном случае вам нужно прочитать сборку функции, чтобы выяснить, где находится фактическая переменная, а затем сообщить отладчику о том, чтобы напечатать соответствующий адрес.

Ответ 2

У меня была эта проблема, когда я включил "Address Sanitizer" из моей схемы приложений. Отключите его, исправив проблему.

Ответ 3

Я вижу это, когда я запускаю сборку RELEASE (vs DEBUG) (Product- > Scheme...- > Edit Scheme...- > Info, а затем задаю Build Configuration для "Debug".

Ответ 4

У меня была эта проблема при компиляции с флагом -Og. Почему-то я думал, что это означает "оптимизировать для отладки". Я не думаю, что это так на самом деле. Снятие этого флага решило проблему для меня.