【手冊】GDB調試指令

1.列出源程序

(gdb) l(list) <line>                //列出(line-5)行到(line-1+5)行間的內容
(gdb) l(list) <line1,line2>         //列出(line1)行到(line2)行間的內容

2.運行程序

(gdb) r(run) <arg1,arg2,...,argn>   //若“不列出參數”,則使用“上次輸入參數”
(gdb) show args                     //查看當前使用“參數”
(gdb) set args <arg1,arg2,...,argn> //設置當前使用“參數”

3.斷點操作

(gdb) b(break) <line>               //在執行到第line行時中斷
(gdb) b(break) <func>               //在執行func時中斷
(gdb) b(break) <id> if <exp>        //在exp成立時設置斷點
(gdb) b(break) <file:line>          //在文件file的第line行設置斷點
(gdb) info break                    //查看斷點信息
(gdb) d(delete) breakpoint <point>  //刪除第point號斷點
(gdb) enable breakpoint <point>     //使能第point號斷點
(gdb) disable breakpoint <point>    //禁用第point號斷點
(gdb) clear                         //刪除所有斷點
(gdb) clear <line>                  //刪除第line行上的所有斷點
(gdb) watch <exp>                   //當exp成立時觸發中斷,輸出觀察點信息

4.觀察運行數據

(gdb) p(print) <var>                //打印變量var的值
(gdb) p(print) <file::var>          //打印變量var的值
(gdb) p(print) <func::var>          //打印變量var的值
(gdb) p(print) *array@end           //打印數組array從0號到end-1號元素的值
(gdb) p/x <var>                     //以“十六進制”打印變量var的值
(gdb) p/d <var>                     //以“十進制”打印變量var的值
(gdb) p/u <var>                     //以“十進制無符號數”打印變量var的值
(gdb) p/o <var>                     //以“八進制”打印變量var的值
(gdb) p/t <var>                     //以“二進制”打印變量var的值
(gdb) p/a <var>                     //以“十六進制”打印變量var的值
(gdb) p/c <var>                     //以“字符格式”打印變量var的值
(gdb) p/f <var>                     //以“浮點數”打印變量var的值

5.查看內存

(gdb) x(examine) /nfu <addr>
    //數量n       顯示n個單位的內存內容
    //格式f       s:字符串,i:指令,其他與print相同
    //單位u       b:1,h:2,w:4,g:8

6.自動顯示變量

(gdb) display /f <var>              //格式f       與examine相同
(gdb) info display                  //顯示所有自動顯示的變量信息
(gdb) display                       //刪除所有自動顯示變量
(gdb) delete display <dnums>        //刪除編號爲dnums的自動顯示變量
(gdb) enable display <dnums>        //使能第dnums號自動顯示變量
(gdb) disable display <dnums>       //禁用第dnums號自動顯示變量

7.顯示變量的歷史記錄

(gdb) printf $n                    //顯示第n個歷史記錄的值

8.查看寄存器

(gdb) info registers                //顯示所有寄存器(不包括浮點寄存器)的值
(gdb) info all-registers            //顯示所有寄存器(包括浮點寄存器)的值
(gdb) info registers <reg>          //顯示寄存器reg的值

9.查看gdb的環境變量

set $var=i
show convenience

10.改變程序執行

10.1 修改變量的值

    print/set i=30

10.2 跳轉執行

    jump <location>
    set $pc=0x45

10.3 信號的產生及處理

    signal <signum>
    handle <sig-name> <whattodo>    //whattodo: nostop stop print noprint pass nopass

10.4 強制調用函數

    call func(arg1,arg2,...)

10.5 強制函數返回

    return <value>

11.機器碼與計算機構造

11.1 產生core文件

    gdb exe core

11.2 跟蹤棧上數據

    bt(backtrace)
    frame n
    info locals

11.3 綁定運行進程

    gdb exe pid
    detach
    attach pid

11.4 源文件搜索

    search regexp                   //向下搜索匹配行
    reverse-search regexp           //向上搜索匹配行
    print $_                       //打印匹配行號

11.5 機器語言工具

    $ip        當前指令地址
    $pc        當前指令內容
    $fp        幀指針
    $sp        棧指針
    $ps        處理器狀態
    info line n                     //打印行n在內存中的位置
    disassemble func                //查看函數func的反彙編

12.調試多進程程序

使用 GDB 調試多進程程序

12.1 follow-fork-mode

  • 在2.5.60版Linux內核及以後,GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試:
    set follow-fork-mode [parent|child]

    • parent: fork之後繼續調試父進程,子進程不受影響。
    • child: fork之後調試子進程,父進程不受影響。
  • detach-on-fork參數,指示GDB在fork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制:
    set detach-on-fork [on|off]

    • on: 斷開調試follow-fork-mode指定的進程。
    • off: gdb將控制父進程和子進程,follow-fork-mode指定的進程將被調試,另一個進程置於暫停(suspended)狀態。

12.2 Attach子進程

  • attach 命令:附着(attach)到正在運行的進程

12.3 GDB wrapper

  • 很多時候,父進程 fork 出子進程,子進程會緊接着調用 exec族函數來執行新的代碼。對於這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用添加額外代碼。

12.4 小結

上述三種方法各有特點和優劣,因此適應於不同的場合和環境:

  • follow-fork-mode方法:方便易用,對系統內核和GDB版本有限制,適合於較爲簡單的多進程系統
  • attach子進程方法:靈活強大,但需要添加額外代碼,適合於各種複雜情況,特別是守護進程
  • GDB wrapper方法:專用於fork+exec模式,不用添加額外代碼,但需要X環境支持(xterm/VNC)。

其他

pwd
cd
quit
shell [cmdline]
show language
info frame
info source
set language
(gdb) set debug-file-directory
(gdb) show debug-file-directory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章