【手册】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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章