誰かが私に簡単な概要を教えてくれますか/ Cプログラムのスタック(およびヒープ?)を検査する方法のドキュメントを教えてください。これはGDBで行うべきだと思いましたが、他にもっと簡単な方法があれば、それでも問題ありません。
ありがとう。
デバッグにGDBを使用する最初のアプローチは、ブレークポイントを設定することです。これはそのように行われます-
Prompt> gdb ./x_bstree.c
(gdb) #Prompt
(gdb) b 123 #break at line 123
(gdb) r #start program
これで、プログラムはプログラムの123行目で停止します。これで、print
を使用してスタックまたはヒープ内の変数を調べることができます。スタック変数の場合は、print <varname>
を使用してください。ヒープ変数(ポインター)には、print <*varname>
を使用します。スタック/ヒープ変数を調べるために何か特別なことをする必要があるかどうかわかりませんか?
もちろん、マルチスレッドアプリケーションをデバッグするには、シングルスレッドモードで実行してからdubugを実行する必要があります。そうしないと、何が起こっているのかを予測することが困難になります。
'x'コマンドでrawメモリをダンプできます
したがって、スタックまたはヒープのビットを確認したい場合は、次のようなことを試してください。
x/10b &stackvar
x/200b &heapvar-20
最後のものは、heapvarの前の20バイトから始まる200バイトを示します。したがって、マロックした場合は、ヒープヘッダーも表示されます。
ddd
を使用してみてください。 dddマニュアル
OK。多分私は少し詳しく説明します。こんな感じで使っています。
デバッグシンボルを使用してプログラムをコンパイルします。
gcc -g program.c -o program
実行ddd
:
ddd program
GUIでは、あらゆる種類のことを実行したり、マシンコードを表示したり、メモリを表示したりできます。見回す。マニュアルには、スタックを調べるセクションもあります。 ddd
は、Cプログラムを調べるための優れたインターフェースを提供します。
スタックの表示:gdb> backtrace
現在のスタックフレームを表示します:gdb> info frame
現在のスタックフレームの引数を表示します:gdb> info args
現在のスタックフレームのローカル変数を表示します:gdb> info locals
親スタックフレームに移動します:gdb> frame 1