1

GDBを使用してスタックの特定の場所に何が格納されているかを把握しようとしています。私は声明を持っています:

cmpl $0x176,-0x10(%ebp)

この関数では、0x176を-0x10(%ebp)と比較していますが、-0x10(%ebp)に何が格納されているかを確認する方法があるかどうか疑問に思っています。

4

1 に答える 1

4

-0x10(%ebp)に何が保存されているかを確認する方法があるかどうか疑問に思っています。

デバッグ情報を使用してコンパイルしたと仮定するとinfo locals、現在のフレームのすべてのローカル変数について通知されます。その後、開始からprint (char*)&a_local - (char*)$ebpまでのオフセットを教えてくれます。通常、ローカルがに近いかどうかを確認できます。a_local%ebp0x176

また、info line NNローカルに初期化子がある場合は、特定のローカルの初期化に対応するアセンブリ命令範囲を特定disas ADDR0,ADDR1し、逆アセンブルを確認して、どのローカルがどのオフセットにあるかを再度理解することができます。

もう1つの方法はreadelf -w a.out、次のようなエントリを探すことです。

int foo(int x) { int a = x; int b = x + 1; return b - a; }

<1><25>: Abbrev Number: 2 (DW_TAG_subprogram)
 <26>   DW_AT_external    : 1        
 <27>   DW_AT_name        : foo      
 <2b>   DW_AT_decl_file   : 1        
 <2c>   DW_AT_decl_line   : 1        
 <2d>   DW_AT_prototyped  : 1        
 <2e>   DW_AT_type        : <0x67>   
 <32>   DW_AT_low_pc      : 0x0      
 <36>   DW_AT_high_pc     : 0x23     
 <3a>   DW_AT_frame_base  : 0x0      (location list)
 <3e>   DW_AT_sibling     : <0x67>   
<2><42>: Abbrev Number: 3 (DW_TAG_formal_parameter)
 <43>   DW_AT_name        : x        
 <45>   DW_AT_decl_file   : 1        
 <46>   DW_AT_decl_line   : 1        
 <47>   DW_AT_type        : <0x67>   
 <4b>   DW_AT_location    : 2 byte block: 91 0       (DW_OP_fbreg: 0)
<2><4e>: Abbrev Number: 4 (DW_TAG_variable)
 <4f>   DW_AT_name        : a        
 <51>   DW_AT_decl_file   : 1        
 <52>   DW_AT_decl_line   : 1        
 <53>   DW_AT_type        : <0x67>   
 <57>   DW_AT_location    : 2 byte block: 91 74      (DW_OP_fbreg: -12)
<2><5a>: Abbrev Number: 4 (DW_TAG_variable)
 <5b>   DW_AT_name        : b        
 <5d>   DW_AT_decl_file   : 1        
 <5e>   DW_AT_decl_line   : 1        
 <5f>   DW_AT_type        : <0x67>   
 <63>   DW_AT_location    : 2 byte block: 91 70      (DW_OP_fbreg: -16)

これにより、、、、およびにx保存されていることがわかります。ここで、ロケーションリストを調べて、から派生する方法を理解する必要があります。上記のコードのリストは次のようになります。fbreg+0afbreg-12bfbreg-16fbreg%ebp

Contents of the .debug_loc section:

Offset   Begin    End      Expression
00000000 00000000 00000001 (DW_OP_breg4: 4)
00000000 00000001 00000003 (DW_OP_breg4: 8)
00000000 00000003 00000023 (DW_OP_breg5: 8)
00000000 <End of list>

したがって、体のほとんどの場合、はです。これfbreg%ebp+8、にあることを意味a%ebp-4ます。分解により確認:

00000000 <foo>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
   6:   8b 45 08                mov    0x8(%ebp),%eax  # 'x' => %eax
   9:   89 45 fc                mov    %eax,-0x4(%ebp) # '%eax' => 'a'

..。

于 2012-04-18T03:19:24.397 に答える