2

GDB を使用して C++ プログラムをデバッグする際に少し問題があります。

を使用するprint object.memberと、変数の値が常に正しく出力されるとは限りません。代わりに、引数の 1 つの値をデバッグ中の関数に出力します。object.memberそして、全体の値を変更しても、関数によっては変更されません。

問題は、プログラムがかなり大きく、いくつかのモジュールで構成されており、部分的に特化したテンプレートなどが含まれているため、ここにすべてを投稿することはできません.
今、最小限のテストケースを作成しようとしましたが、簡単に試してみましたが、うまくいきません。つまり、仕事ではありません。

だから私が尋ねることができるのは、GDBでこの動作を見たことがありますか?また、その原因と解決方法を見つけましたか?

同様の動作についてここで質問がありますが、それらはプログラムが適切にコンパイルされていないことに相当します (最適化レベルが高すぎるなど)。でコンパイルした-Wall -Wextra -pedantic -g -O0ので、それはできません。

そして、プログラムは正常に実行されます。私はcout << object.member;期待値を出力することができるので、今何を試すべきかわかりません。

4

1 に答える 1

0

以前に同様の動作を見たことがあります。残念ながら、gdb は実際には 'C' ベースであるため、C++ を処理しますが、値の表示に関して非常にうるさいことが時々あります。

より複雑なアイテム (マップ、文字列、またはスマート ポインターの参照解除されたコンテンツなど) を表示する場合、変数の参照解除とキャストについて明確にする必要がある場合があります。

もう 1 つの可能性は、関数自体です。何か変わったことはありますか? たとえば、テンプレート化されていますか?

コードでこの変数への参照を作成し、それを表示してみてください。または、変数のアドレスを取得し、コンテンツを参照解除します-もちろん、それが公開されている場合のみ。

当然、ソースコードはコンパイルしたものと一致する必要があるため、exeよりも古い必要がありますが、gdbは通常、そのようなことについて警告します

于 2012-04-25T12:31:43.847 に答える