手册GDB调试指令
Posted seastargreen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手册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) *[email protected] //打印数组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.调试多进程程序
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
以上是关于手册GDB调试指令的主要内容,如果未能解决你的问题,请参考以下文章
[QNX Hypervisor 2.2用户手册]9.6 gdb
GDB反向调试(Reverse Debugging)命令 ?