歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

gdb調試匯編指令和查看寄存器

gdb支持源碼級調試,這是眾所周知的事情。當然,你也可以進行匯編級的調試。理論上這個更應該有用。(因為很多程序的編譯常常沒有源碼級別的調試信息)

那麼怎麼做?

先寫一個最簡單的源代碼。

$ cat > a.c
int main(void)
{
    int i = 0;
    i = 2;
    return 0;
}

Ctrl + D 保存,編譯。
$ gcc a.c
開始調試。
$ gdb a.out
輸入斷點
(gdb) break main
開始運行
(gdb) run
顯示匯編代碼。
(gdb) disassemble
默認的匯編語言編碼是att模式。你可以手動修改為intel風格。
(gdb) set disassembly-flavor intel
重新顯示匯編代碼。
(gdb) disassemble
最左端的 => 是當前即將執行的匯編指令。
因為編譯的時候,沒有加上-g選項,所以沒有符號表信息,所以此時只能檢測寄存器的值。想要檢測某個寄存器的值。怎麼做?
下面所示。比如要顯示 rbp的值。
(gdb) print $rbp
要執行到下一行。怎麼做?
(gdb) nexti
遇到一個函數調用的時候(匯編指令是 call),怎麼進入函數?
(gdb) stepi
直接運行到這個函數結束(即跳出幀),怎麼做?
(gdb) finish
然後,就可以一個指令,一個指令的運行了。仍然是nexti。
如何在任意匯編指令上添加斷點?比如在執行 mov    eax,0x0 的位置加上斷點。怎麼做?
(gdb) break *0x0000000000400486
這個16進制數是這個指令的地址,也就是該行最左端的16進制數。
想要直接運行到上述斷點處,怎麼做?
(gdb) continue
在此處,查看eax寄存器的值。
(gdb) print $eax
然後,執行nexti 可以再次檢查,eax的值是不是變為了0x0。
(當然,它肯定會變成0x0的,除非這個這個機器的中央處理器有重大缺陷)

GDB調試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

GDB+GDBserver無源碼調試Android 動態鏈接庫的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

使用hello-gl2建立ndk-GDB環境(有源碼和無源碼調試環境) http://www.linuxidc.com/Linux/2013-06/85935.htm

在Ubuntu上用GDB調試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

Linux下用GDB調試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

Ubuntu下使用GDB斷點Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

注:以下是簡單的演示腳本。(示例中沒有函數調用)

$ mkdir 1; cd 1
$ cat >a.c
int main()
{
    int i = 0;
    i = 1;
    return 0;
}
$ gcc a.c
$ gdb -silent a.out
Reading symbols from /home/nbz/1/a.out...(no debugging symbols found)...done.
(gdb) break main
Breakpoint 1 at 0x400478
(gdb) set disassembly-flavor intel
(gdb) run 
Starting program: /home/nbz/1/a.out

Breakpoint 1, 0x0000000000400478 in main ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64
(gdb) disassemble
Dump of assembler code for function main:
  0x0000000000400474 <+0>: push  rbp
  0x0000000000400475 <+1>: mov    rbp,rsp
=> 0x0000000000400478 <+4>: mov    DWORD PTR [rbp-0x4],0x0
  0x000000000040047f <+11>: mov    DWORD PTR [rbp-0x4],0x1
  0x0000000000400486 <+18>: mov    eax,0x0
  0x000000000040048b <+23>: leave 
  0x000000000040048c <+24>: ret   
End of assembler dump.
(gdb) print $rbp

GDB 的詳細介紹:請點這裡
GDB 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved