自分の C++ コードをデバッグするときに、GDB (実際には DDD gui を使用) のいくつかのことが混乱します。
1) HEAP ERROR クラッシュ後にバックトレースが利用できないのはなぜですか? 2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか? 3) コメント行をステップ実行すると、いくつかの命令が実行されることがあります (gdb ビジー)??
どんな説明でも大歓迎です、
ペトル
自分の C++ コードをデバッグするときに、GDB (実際には DDD gui を使用) のいくつかのことが混乱します。
1) HEAP ERROR クラッシュ後にバックトレースが利用できないのはなぜですか? 2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか? 3) コメント行をステップ実行すると、いくつかの命令が実行されることがあります (gdb ビジー)??
どんな説明でも大歓迎です、
ペトル
1) ヒープ エラーかどうかはわかりませんが、たとえばメモリが不足している場合、バックトレースを適切に処理できない可能性があります。また、ヒープの破損によってポインターがアプリケーションのスタックの一部を爆破し、バックトレースが利用できなくなった場合。
2) 最適化を有効にしている場合、これが発生する可能性は十分にあります。コンパイラはステートメントを並べ替えることができ、ブレークポイントが配置された基になるアセンブリは、コードの後の行に対応する場合があります。そのようなものをデバッグしようとするときは、最適化を使用しないでください。
3) これは、実行前にソース コードが再構築されていないことが原因である可能性があります (そのため、バイナリが実際のソースと異なるか、最適化設定とは異なる場合もあります。
いくつかの可能な説明:
1) HEAP ERROR クラッシュ後にバックトレースが利用できないのはなぜですか?
プログラムがコア ダンプ ファイルを生成している場合は、次のように GDB を実行できます: "gdb program -c corefile" とバックトレースを取得します。
2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか?
通常、ブレークポイントはステートメントに配置されるため、注意してください。ここでの問題は、バイナリと使用しているコードの不一致が原因である可能性もあります。
3) コメント行をステップ実行すると、いくつかの命令が実行されることがあります (gdb ビジー)??
繰り返しますが、#2 を参照してください。
2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか?
コンパイル中に最適化を有効にしていますか? その場合、コンパイラはコードの重要な再配置を行っている可能性があります...これは、番号3にも対処できると考えられます。
最適化をオフにするには、使用g++
する-O0
か使用しないでください。-O
あなたの番号1が何を求めているのかわかりません。
ブレークポイントとコメント/命令の動作に関して、最適化を有効にしてコンパイルしています-O3
か (例: など)。GDB はそれを処理できますが、最適化されたコードをデバッグするときに、特に積極的な最適化でコンパイルされたコードで、あなたが見ている動作が発生することがあります。
main
リターン後に行われます。GDB で試してくださいset backtrace past-main
。クラッシュしている場合 (プロセスがなくなっている場合)、コア ファイルをデバッガーにロードする必要があります ( gdb prog core
)。