web-dev-qa-db-ja.com

gdbを使用してスタック/ヒープを探索する方法は?

誰かが私に簡単な概要を教えてくれますか/ Cプログラムのスタック(およびヒープ?)を検査する方法のドキュメントを教えてください。これはGDBで行うべきだと思いましたが、他にもっと簡単な方法があれば、それでも問題ありません。

ありがとう。

18
Dervin Thunk

デバッグに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を実行する必要があります。そうしないと、何が起こっているのかを予測することが困難になります。

その他については、 gdb の広範なドキュメントがあり、多くのサイトでも-が提供されています。 gdbチートシート

2

'x'コマンドでrawメモリをダンプできます

したがって、スタックまたはヒープのビットを確認したい場合は、次のようなことを試してください。

x/10b &stackvar
x/200b &heapvar-20

最後のものは、heapvarの前の20バイトから始まる200バイトを示します。したがって、マロックした場合は、ヒープヘッダーも表示されます。

16
pm100

dddを使用してみてください。 dddマニュアル

OK。多分私は少し詳しく説明します。こんな感じで使っています。

デバッグシンボルを使用してプログラムをコンパイルします。

gcc -g program.c -o program

実行ddd

ddd program

GUIでは、あらゆる種類のことを実行したり、マシンコードを表示したり、メモリを表示したりできます。見回す。マニュアルには、スタックを調べるセクションもあります。 dddは、Cプログラムを調べるための優れたインターフェースを提供します。

3
Casual Coder

スタックの表示:gdb> backtrace

現在のスタックフレームを表示します:gdb> info frame

現在のスタックフレームの引数を表示します:gdb> info args

現在のスタックフレームのローカル変数を表示します:gdb> info locals

親スタックフレームに移動します:gdb> frame 1

スタックの調査

3
Mahler