5

llvm 4.1 でコンパイルされた Xcode 4.5 で C++ コードをデバッグしようとしています。コードは非常に単純で、いくつかのアイテムをマップに挿入するだけです。

STL 関数をステップ オーバーすると、通常どおりステップを実行するのではなく、STL コード内で実行が停止します。

LLVM-GCC 4.2 を使用してコンパイルすると、デバッグはうまくいきますが、このコンパイラは C++11 をサポートしていません。

以前にこの問題に遭遇した人はいますか?修正できるかどうか知っていますか?

4

2 に答える 2

2

Xcode 4.5.x の lldb は、インライン関数のステップ オーバーをサポートしていません。C++11 標準ライブラリには、-O0 でビルドされた場合でも積極的な関数のインライン展開があるため、この問題は特に明白です。その後、インライン化されたステッピングのサポートが lldb v. http://llvm.org/viewvc/llvm-project?view=rev&revision=163044に追加され、http: //lldb.llvm.org/のソースで使用できるただし、Xcode 内の lldb をこれらのソースに置き換えることはできません (4.5 がリリースされてから API が変更されました)。

インライン化された関数のステップ オーバー (デバッガーでの作業時に「実際の」関数のように見せる) は複雑な機能であり、clang によって生成されたデバッグ情報が不正確であると、ステップ動作が不適切になる可能性があることに注意してください。デバッグ情報が不十分であるか、lldb のバグが原因で、正しく動作しないコーナー ケースがあります (そして今後もそうなるでしょう)。これを 100% 正しく行うのは難しいことです。

C++ 11 std lib プログラミングの手間を少し軽減するには、

settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::

あなたの~/.lldbinitファイルに。これがインライン関数に役立つとは思いませんが、stdlib メソッドの呼び出しが行外の場合、少なくともそれをステップオーバーします。

于 2012-11-04T00:39:31.057 に答える
2

LLDB が Xcode に導入されて以来、私は確かに同じ問題を経験する可能性があります。インライン関数のステップ オーバーを適切に処理していないようです (参照: C++11 std lib からステップ アウトしようとすると、デバッガがさらに深くステップします)。

Apple にバグ レポート (ID 12588579) を提出しましたが、C++11 の製品コードで LLDB を完全に使用できるようになるまでには、数回の反復が必要になると思います (そこに到達しています。出荷されたバージョンを覚えておいてください)。 Xcode では 4.4 まではまったく使用できませんでした)。

于 2012-10-28T08:29:24.540 に答える