web-dev-qa-db-ja.com

gdbでスタックの内容をどのように見ることができますか

私はgdbが初めてなので、質問があります。

  • スタックの内容をどのように見ることができますか?例:レジスタの内容を表示するには、info registersと入力します。スタックの場合

  • $0x4(%esp)のコンテンツを表示するにはどうすればよいですか? print /d $0x4(%esp)と入力すると、gdbでエラーが発生します。

プラットフォーム:linux gdb

78
user478571

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

指定されたアドレスのメモリを読み取るには、xを確認する必要があります

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

93
DipSwitch

つかいます:

1. bt-バックトレース:スタック関数と引数を表示

2. info frame-スタックの開始/終了/引数/ローカルポインターを表示

3. x/100x $sp-スタックメモリの表示

    
(gdb)bt 
#0 zzz()at zzz.c:96 
#1 0xf7d39cba in yyy(arg = arg @ entry = 0x0)at yyy.c:542 
#2 yyyinit()in 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);保存されたeip 0xf7f1fea1 
ソース言語c。
 Arglist at 0xffeac768、args:argc = 1、argv = 0xffffd5e4 
 Locals at 0xffeac768、Previous frame's sp is 0xffeac770 
 Savedレジスタ:
 ebx at 0xffeac75c、ebp at 0xffeac768、esi at 0xffeac764、edi at 0xffeac764、eip at 0xffeac76c 
 
(gdb)x/10x $ sp 
 0xffeac63c :0xf7d39cba 0xf7d3c0d8 0xf7d3c21b 0x00000001 
 0xffeac64c:0xf78d133f 0xffeac6f4 0xf7a14450 0xffeac678 
 0xff.ac_c6:0x00000000 0xf7d3
57
gaoithe

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

gdb> x/4xw $sp

「スタックポインター(ここでは、$sp)の上のメモリの4ワード(w)を16進数(x)で印刷します。引用はわずかに言い換えられています。

52
unwind