現在のアセンブリ命令をGDBに表示します


179

GDBでアセンブリレベルのデバッグを行っています。現在のソース行を表示するのと同じ方法でGDBに現在のアセンブリ命令を表示させる方法はありますか?すべてのコマンドの後のデフォルトの出力は次のようになります。

0x0001433f      990         Foo::bar(p);

これにより、現在の命令のアドレスがdisassembleわかりますが、現在実行中の命令を確認するには、の出力を参照し続ける必要があります。


回答:


314

GDBでアセンブリレイアウトに切り替えることができます。

(gdb) layout asm

詳細については、こちらをご覧ください。現在のアセンブリ命令がアセンブラウィンドウに表示されます。

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

1
@ greatwolf、gdbでtuiをサポートしていないようです。詳細については、この質問を参照してください:stackoverflow.com/q/6706838/72178
ks1322 2013

9
きちんと!レジスターに同様のウィンドウを設定できますか?実際、私がすることができます:layout regs
イェンス・

整数のregの代わりにベクトルregを表示するなど、他のTUIコマンドについてはgdb docsも参照してくださいtui reg vector。(ただし、それだけでは.v8_int16何も選択できないため、必ずしも使い勝手がよいとは限りません。そのため、表示は非常に混乱します。)asmをデバッグするための簡単なチュートリアルについては、x86タグwikiを参照してください。
Peter Cordes

それは役に立たない機能と出力についてです。C ++のマングル名が長すぎるため、表示しようとしているものはすべて画面の右側にあります。どのような愚かな決定(デフォルトではASMを表示しない場合si)、および役に立たない機能(必要な情報を表示しないビューポート)。あなたはメッセンジャーにすぎないため、この回答に投票する意味はありません...
jww

1
同様に、·layout srcデバッグ時にソースコードを確認し、このモードを終了することも忘れないでくださいCTRL+x+a
Baiyan Huang

149

できるよ

display/i $pc

GDBが停止するたびに、次の命令の逆アセンブリが表示されます。

GDB-7.0set disassemble-next-line on、次の行全体を逆アセンブルし、逆アセンブルコンテキストの詳細を提供するもサポートしています。


1
を使用するときにsi(ただし、ではなくs)この機能を有効にするにはどうすればよいですか?
jww 2017年

54

コマンド

x/i $pc

通常の構成メカニズムを使用して、常に実行するように設定できます。


29
そしてx/ni $pc、次のn個の命令を表示することは、非常に便利です。
スティーブンキャノン

48

次のオプションを設定します。

set  disassemble-next-line on
show disassemble-next-line

次のような結果が得られます。

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0

このオプションは私のインストールには存在しないようです。削除されましたか?
fuz 2017

2
@fuz可能性が高い、あなたのgdbは古い
tbodt 2017年

@fuzは、少なくともUbuntu 18.04のGDB 8.1に存在します。
Ciro Santilli郝海东冠状病六四事件法轮功

非常に便利なスキル
DaSqy Stc

1
show disassemble-next-lineはテスト用であり、フラグのステータスをオンまたはオフに出力します
Sam

30

プログラムのステップ実行中に次のいくつかの指示を自動的に表示する場合は、displayコマンドを次のように使用できます-

display /3i $pc

上記の例では、ブレークポイントに到達したとき、またはプログラムをシングルステップしたときに3つの命令が表示されます。

詳細については、こちらのブログエントリをご覧ください


23

gdbを押すCtrl x 2と、画面が3つの部分に分かれます。

最初の部分では、高級言語で通常のコードを示します。

2番目は、同等のアセンブリと対応するアセンブリを示しますinstruction Pointer

3番目は、gdbコマンドを入力する通常のプロンプトを表示します。

スクリーンショットを見る


で起動できませんでしたがCtrl-X 2gdb -tuiモードのように見えて素晴らしいです。
Ciro Santilli郝海东冠状病六四事件法轮功

7
これはlayout split、gdbプロンプトからも到達できます。
チャックスマッシュ2017

22

GDBダッシュボード

https://github.com/cyrus-and/gdb-dashboard

このGDB構成では、公式のGDB Python APIを使用して、たとえばnextTUIのように、GDBが停止した後はいつでも何でも表示します。

しかし、私はこの実装は、より堅牢で設定可能な選択肢があることを発見したビルトインGDB TUIモードで説明したように:コードでgdbの分割ビュー

たとえば、GDBダッシュボードを構成して、以下を使用して逆アセンブリ、ソース、レジスタ、スタックを表示できます。

dashboard -layout source assembly registers stack

代わりに使用可能なすべてのビューを有効にすると、次のようになります。

ここに画像の説明を入力してください

関連する質問:


1
@downvoters:私が情報を学び、改善できるように説明してください。:私は、これはTUI現在受け入れ答えのための優れた選択肢であると信じていstackoverflow.com/a/2015523/895245
チロSantilli郝海东冠状病六四事件法轮功
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.