このコマンドラインでcppファイルをコンパイルしました:_g++ -g test.cpp
_
28行目で例外がスローされます。lldbの変数を調べて原因を調査します。 28行目にブレークポイントを設定し、lldbで_a.out
_を実行します。
_(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
このエラーは、デバッグ情報に変数が含まれていることを意味しますが、現在のPCに格納場所がないことを示しています。
これは、変数が最適化されたため(変数の関数を呼び出しているだけの可能性は低い)、またはコンパイラが変数のデバッグ情報を消去し、どこに行ったかを追跡できなくなったことが原因である可能性があります。
より高い最適化レベルで適切なデバッグ情報を出力するコンパイラは多くないため、-O0でデバッグしようとしているコードをコンパイルしていることを確認してください。 -O0でコンパイルしている場合、これはコンパイラのバグです。あなたはおそらくそれをgccの人々に報告するべきです。 clangで運が良かったかどうかを確認できます。それ以外の場合は、関数のアセンブリを読み取って、変数が実際にどこに存在するかを確認し、適切なキャストアドレスを出力するようデバッガーに指示する必要があります。
アプリスキームから「アドレスサニタイザー」を有効にすると、この問題が発生しました。無効にすると問題が修正されます。
RELEASE(対DEBUG)ビルド(Product-> Scheme ...-> Edit Scheme ...-> Info)を実行して、ビルド構成を「デバッグ」に設定すると、これが表示されます。
フラグ-Og
を使用してコンパイルすると、この問題が発生しました。どういうわけか私はそれが「デバッグのために最適化する」ことを意味すると思っていました。実際にはそうではないと思います。そのフラグを削除すると、問題が解決しました。