GDBでスタックの内容を確認するにはどうすればよいですか?


94

私はGDBを初めて使用するので、いくつか質問があります。

  • スタックの内容を確認するにはどうすればよいですか?例:レジスターの内容を表示するには、と入力しinfo registersます。スタックの場合、それはどうあるべきですか?

  • 内容を確認するにはどうすればよい$0x4(%esp)ですか?と入力するとprint /d $0x4(%esp)、GDBでエラーが発生します。

プラットフォーム:LinuxおよびGDB


回答:


113

info frame スタックフレーム情報を表示する

指定されたアドレスのメモリを読み取るには、 x

x/x $esp符号なし、符号なしなどの16進数のx/d $esp場合x/u $esp。xはフォーマット構文を使用しますx/i $eip。現在の命令などを確認することもできます。


69

使用する:

  • bt -バックトレース:スタック関数と引数を表示
  • info frame -スタックの開始/終了/引数/ローカルポインターを表示する
  • x/100x $sp -スタックメモリを表示
(gdb) bt
#0  zzz () at zzz.c:96
#1  0xf7d39cba in yyy (arg=arg@entry=0x0) at yyy.c:542
#2  0xf7d3a4f6 in yyyinit () at yyy.c:590
#3  0x0804ac0c in gnninit () at gnn.c:374
#4  main (argc=1, argv=0xffffd5e4) at gnn.c:389

(gdb) info frame
Stack level 0, frame at 0xffeac770:
 eip = 0x8049047 in main (goo.c:291); saved eip 0xf7f1fea1
 source language c.
 Arglist at 0xffeac768, args: argc=1, argv=0xffffd5e4
 Locals at 0xffeac768, Previous frame's sp is 0xffeac770
 Saved registers:
  ebx at 0xffeac75c, ebp at 0xffeac768, esi at 0xffeac760, edi at 0xffeac764, eip at 0xffeac76c

(gdb) x/10x $sp
0xffeac63c: 0xf7d39cba  0xf7d3c0d8  0xf7d3c21b  0x00000001
0xffeac64c: 0xf78d133f  0xffeac6f4  0xf7a14450  0xffeac678
0xffeac65c: 0x00000000  0xf7d3790e

55

gdbのメモリ表示コマンドを使用する必要があります。基本的なものはx、検討のためです。を使用するリンク先のページに例があります

gdb> x/4xw $sp

wスタックポインタ(ここでは$sp)の上にある4ワード()のメモリを16進数(x)で出力します」。引用は少し言い換えられています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.