0

自分の C++ コードをデバッグするときに、GDB (実際には DDD gui を使用) のいくつかのことが混乱します。

1) HEAP ERROR クラッシュ後にバックトレースが利用できないのはなぜですか? 2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか? 3) コメント行をステップ実行すると、いくつかの命令が実行されることがあります (gdb ビジー)??

どんな説明でも大歓迎です、

ペトル

4

5 に答える 5

1

1) ヒープ エラーかどうかはわかりませんが、たとえばメモリが不足している場合、バックトレースを適切に処理できない可能性があります。また、ヒープの破損によってポインターがアプリケーションのスタックの一部を爆破し、バックトレースが利用できなくなった場合。

2) 最適化を有効にしている場合、これが発生する可能性は十分にあります。コンパイラはステートメントを並べ替えることができ、ブレークポイントが配置された基になるアセンブリは、コードの後の行に対応する場合があります。そのようなものをデバッグしようとするときは、最適化を使用しないでください。

3) これは、実行前にソース コードが再構築されていないことが原因である可能性があります (そのため、バイナリが実際のソースと異なるか、最適化設定とは異なる場合もあります。

于 2010-07-22T20:43:22.103 に答える
1

いくつかの可能な説明:

1) HEAP ERROR クラッシュ後にバックトレースが利用できないのはなぜですか?

プログラムがコア ダンプ ファイルを生成している場合は、次のように GDB を実行できます: "gdb program -c corefile" とバックトレースを取得します。

2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか?

通常、ブレークポイントはステートメントに配置されるため、注意してください。ここでの問題は、バイナリと使用しているコードの不一致が原因である可能性もあります。

3) コメント行をステップ実行すると、いくつかの命令が実行されることがあります (gdb ビジー)??

繰り返しますが、#2 を参照してください。

于 2010-07-22T20:43:52.597 に答える
0

2) gdb がブレークポイントで停止するのではなく、ブレークポイントの後に停止することがあるのはなぜですか?

コンパイル中に最適化を有効にしていますか? その場合、コンパイラはコードの重要な再配置を行っている可能性があります...これは、番号3にも対処できると考えられます。

最適化をオフにするには、使用g++する-O0か使用しないでください。-O

あなたの番号1が何を求めているのかわかりません。

于 2010-07-22T20:40:59.077 に答える
0

ブレークポイントとコメント/命令の動作に関して、最適化を有効にしてコンパイルしています-O3か (例: など)。GDB はそれを処理できますが、最適化されたコードをデバッグするときに、特に積極的な最適化でコンパイルされたコードで、あなたが見ている動作が発生することがあります。

于 2010-07-22T20:41:28.590 に答える
0
  1. ヒープ チェックはおそらくmainリターン後に行われます。GDB で試してくださいset backtrace past-main。クラッシュしている場合 (プロセスがなくなっている場合)、コア ファイルをデバッガーにロードする必要があります ( gdb prog core)。
  2. 最適化されたコード、@dmckee の回答を参照
  3. 2と同じ。
于 2010-07-22T20:45:01.077 に答える