GDBでアセンブリレベルのデバッグを行っています。現在のソース行を表示するのと同じ方法でGDBに現在のアセンブリ命令を表示させる方法はありますか?すべてのコマンドの後のデフォルトの出力は次のようになります。
0x0001433f 990 Foo::bar(p);
これにより、現在の命令のアドレスがdisassemble
わかりますが、現在実行中の命令を確認するには、の出力を参照し続ける必要があります。
GDBでアセンブリレベルのデバッグを行っています。現在のソース行を表示するのと同じ方法でGDBに現在のアセンブリ命令を表示させる方法はありますか?すべてのコマンドの後のデフォルトの出力は次のようになります。
0x0001433f 990 Foo::bar(p);
これにより、現在の命令のアドレスがdisassemble
わかりますが、現在実行中の命令を確認するには、の出力を参照し続ける必要があります。
回答:
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)
layout regs
tui reg vector
。(ただし、それだけでは.v8_int16
何も選択できないため、必ずしも使い勝手がよいとは限りません。そのため、表示は非常に混乱します。)asmをデバッグするための簡単なチュートリアルについては、x86タグwikiを参照してください。
si
)、および役に立たない機能(必要な情報を表示しないビューポート)。あなたはメッセンジャーにすぎないため、この回答に投票する意味はありません...
·layout src
デバッグ時にソースコードを確認し、このモードを終了することも忘れないでくださいCTRL+x+a
次のオプションを設定します。
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
gdbを押すCtrl
x
2
と、画面が3つの部分に分かれます。
最初の部分では、高級言語で通常のコードを示します。
2番目は、同等のアセンブリと対応するアセンブリを示しますinstruction Pointer
。
3番目は、gdb
コマンドを入力する通常のプロンプトを表示します。
Ctrl-X 2
、gdb -tui
モードのように見えて素晴らしいです。
layout split
、gdbプロンプトからも到達できます。
GDBダッシュボード
https://github.com/cyrus-and/gdb-dashboard
このGDB構成では、公式のGDB Python APIを使用して、たとえばnext
TUIのように、GDBが停止した後はいつでも何でも表示します。
しかし、私はこの実装は、より堅牢で設定可能な選択肢があることを発見したビルトインGDB TUIモードで説明したように:コードでgdbの分割ビュー
たとえば、GDBダッシュボードを構成して、以下を使用して逆アセンブリ、ソース、レジスタ、スタックを表示できます。
dashboard -layout source assembly registers stack
代わりに使用可能なすべてのビューを有効にすると、次のようになります。
関連する質問: