2012-04-02 7 views
32

アセンブリとcコードの両方をgdbで表示する方法はありますか?アセンブリコードとCコードの両方を表示

逆アセンブルfunction_nameはアセンブリのみを表示しますが、私はアセンブリにcコードを簡単にマップする方法を見つけようとしていました。 - ソースコードを表示し、それらの一つ、他の1

gdb -tui <your-binary> 
(gdb) b main 
(gdb) r 
(gdb) layout split 

layout splitコマンドは二つの部分にウィンドウを分割: おかげ

答えて

40

あなたは(TUI)モードテキストユーザーインタフェースでGDBを実行することができます対応するアセンブリ。 いくつかの他のトリック:

  • セット解体フレーバーインテル - あなたは、Intelの表記を好む場合
  • 設定された印刷ASM-デマングルは - 組立図
  • NIでC++の名前をデマングル - 次指示
  • si - 手順説明

TUIモードを使用したくない場合(例:お使いの端末は)それを好きではない、あなたは常に行うことができます:

x /12i $pc 

現在のプログラムカウンタアドレスからプリント12点の指示を意味している - これはまた、上記のトリック(デマングルなど、命令のステッピング)で動作します。

「x/12i $ pc」トリックはgdbとcgdbの両方で機能しますが、「レイアウト分割」はgdbでのみ機能します。

+0

もトップスプリットウィンドウを取り除く方法はありますか?それは不必要でスペースが必要です。 –

+2

@BabkenVardanyan「次のレイアウト」を試してください。望みのレイアウトが得られない場合は、このコマンドをもう一度試してみてください。このコマンドはレイアウト間の切り替えを維持するので、必要なレイアウトを維持できます。 –

17

disassemble /mを試してみてください:)お楽しみください。

はフォーマットがobjdump -Sのと同様であり、分解してソースをintermixes http://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html#Machine-Code

を参照してください。出力例の抜粋:あなたの目的のために

10  int i = 0; 
=> 0x0000000000400536 <+9>: movl $0x0,-0x14(%rbp) 

11  while (1) { 
12   i++; 
    0x000000000040053d <+16>: addl $0x1,-0x14(%rbp) 
+0

私はgdbを再起動したくないので、他の解決策は必要ありませんでした。同じ方法で設定してください。また、再配置されたセクションへの.oファイルの参照は理解しづらいものです。だから私はこれが単なるチケットだと思った。 '0x000000000442f038 <+24>:\tのmov%のRSIは、%RBX 0x000000000442f043 <+35>:\tサブ$ 0x38、私は最終的に/逆アセンブルは黙っ最初、3バイト命令の後のように、いくつかの命令を省略メートルことに気づいたとき、そして、私の恐怖を想像してみて%rsp' これは 'GNU gdb(GDB)7.4.1-debian'です。 –

3

、男性objdumpはから

objdump -S <your_object_file> 

を試してみてください。

-S 
--source 
Display source code intermixed with disassembly, if possible. 
Implies -d. 
関連する問題