2009-12-14 83 views
132

我正在GDB中進行一些彙編級調試。有沒有辦法讓GDB以與顯示當前源代碼行相同的方式顯示當前彙編指令?每個命令後默認輸出是這樣的:在GDB中顯示當前的彙編指令

0x0001433f  990   Foo::bar(p); 

這給了我當前指令的地址,但我必須保持才能看到我目前正在執行該指令指回disassemble輸出。

+0

一個更通用的裝配HOWTO問題:http://stackoverflow.com/questions/589653 /切換到彙編在gdb – 2015-05-09 10:34:32

+1

相關:http://stackoverflow.com/questions/589653/switching-to-assembly-in-gdb – 2015-09-25 19:06:58

回答

236

您可以在GDB切換到裝配佈局:

(gdb) layout asm 

更多信息請參見here。當前彙編指令將在彙編器窗口中顯示。

┌───────────────────────────────────────────────────────────────────────────┐ 
    │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) 
+2

我得到'未定義的命令:「layout」.' – greatwolf 2013-07-02 08:11:00

+0

@greatwolf,看起來像你在gdb中沒有tui支持。有關更多信息,請參閱此問題:http://stackoverflow.com/q/6706838/72178。 – ks1322 2013-07-02 09:33:59

+4

整潔!現在我可以有一個類似的寄存器窗口嗎?事實上,我可以:'佈局regs' – Jens 2014-03-10 03:53:37

35

命令

x/i $pc 

可以被設置爲運行所有使用通常的配置機制的時間。

+19

和'x/ni $ pc'來查看下n個指令,這通常很有用。 – 2009-12-14 19:26:57

117

你可以做

display/i $pc 

每GDB停止時,它會顯示下一條指令的拆卸。

GDB-7.0還支持set disassemble-next-line on,這將拆卸整個下一行,並給你更多的反彙編上下文。

+1

如何在使用'si'(但不是's')時啓用此功能? – jww 2017-05-10 05:32:07

+0

@jww對我來說工作正常...... – tbodt 2017-06-12 22:38:08

23

如果你想在接下來的幾個指令,自動顯示,同時步進通過程序如下您可以使用顯示命令 -

display /3i $pc

上面將顯示3說明每當斷點被擊中或當你單步執行程序。

更多詳情請見博客條目here

14

從gdb內按Ctrlx2屏幕將分成3部分。

第一部分將向您展示高級語言的正常代碼。

第二個將顯示相應的組件和相應的instruction Pointer

第三將爲您呈現正常的gdb提示輸入命令。

See the screen shot

+0

我無法使用Ctrl-X 2啓動它,但它看起來像'gdb -tui'模式,這非常棒。 – 2015-05-09 09:39:39

+2

這也可以通過gdb提示符中的'layout split'來實現。 – chucksmash 2017-02-28 05:01:50

24

設置以下選項:

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 
+0

這個選項似乎並不存在於我的安裝中。它已被刪除? – fuz 2017-04-08 21:35:07

+0

@fuz更可能的是,你的gdb是舊的 – tbodt 2017-06-12 23:15:36