1. 列出源程序
1.1 不带参数的list命令: (gdb) list 或 l
1.2 带一个参数的list命令:(gdb) list <line-number>
1.3 带两个参数的list命令:(gdb) list <line1, line2> 参数line1为显示的起始行,line2为结束行
2. 运行程序命令:(gdb) run <arg1 arg2 ...> 或 (gdb) r <arg1 arg2 ...>
3. 操作断点的命令
3.1 设置断点:
1. 在源程序中指定的行上设置断点:(gdb) break <line-number> 或 (gdb) b <line-number>
2. 在指定的函数前设置断点:(gdb) break <function-name> 或 b <function-name>
3. 使用表达式设置断点:break <line-number/function-name> if <conditional expression>
<line-number>为设置断点的行号,也可以是函数名。<conditional expression>为表达式,如果表达式为真,程序到达
指定行或函数时停止。表达式只要符合使用语言的语法即可,当调试C程序时断点条件可以是任何合法的C表达式。
注意:在条件中指定的变量必须在设置断点的行的变量作用域范围内,否则,这个表达式就没有意义。
4. 在指定例程的入口处设置断点
如果该程序是由很多源文件构成的,则可以在各个源文件中设置断点:
(gdb) break <filename: line-number/function-name>
3.2 显示当前gdb的断点信息
(gdb) info break
3.3 删除指定的断点
(gdb) delete breakpoint <point-number>
3.4 禁止或启用断点
(gdb) enable breakpoint <point-number>
(gdb) disable breakpoint <point-number>
enable 和 disable 命令用来设置断点的可用属性,但禁用并不代表删除断点,使用info break命令依然可以查看到断点信息。
3.5 清除断点
不带参数的clear命令:(gdb) clear
带参数的clear命令:(gdb) clear <number>
3.6 观察点
watch <condition>:在程序中设置一个观察点(即数据断点),<condition>是出发观察点的条件,一旦触发会导致gdb中断。
4. 查看运行时数据
4.1 数据观察命令
(gdb) print <variable-name> 或 (gdb) p <variable-name>
(gdb) print <file::variable>
(gdb) print <function::variable>
4.2 对程序中函数的调用
(gdb) print func(arg1, arg2, ...):对程序中的函数进行调用,并在调用时指定形参的值。
4.3 查看表达式的值
(gdb) print <expression>
4.4 查看数组的值
(gdb) print <array-name>
4.5 变量的输出格式
(gdb) print/? <variable>
数据显示格式:x:按十六进制格式显示变量
d:按十进制格式显示变量
u:按十六进制格式显示无符号整型
o:按八进制格式显示变量
t:按二进制格式显示变量
a:按十六进制格式显示变量
e:按字符格式显示变量
f:按浮点数格式显示变量
4.6 查看内存
(gdb) examine /nfu <address> 或 (gdb) x /nfu <address>
n是一个正整数,表示显示内存的长度,即指定从当前地址向后显示几个单位的内容(一个单位等于几个字节由u参数指定)。
f表示显示的格式,参见变量输出格式的参数定义。如果地址所指的是字符串,那么格式可以使s。如果是指令地址,那么格式可以是i。
u表示从当前地址向后请求的字节数。如果不指定,gdb默认是4个B。u参数可以用下面的字符代替,b表示单字节,h表示双字节,w表示四
字节,g表示八字节。
4.7 自动显示变量
(gdb) display /fmt expr:expr是一个表达式,fmt表示显示的格式(和命令examine的参数一样),当用display设定好了一个或多个表达式后,程序一旦停止,gdb会自动显示所设置的表达式的值。
(gdb) info display
(gdb) undisplay
(gdb) delete display <dnums>
(gdb) disable display <dnums>
(gdb) enable display <dnums>
(gdb) disable display
(gdb) enable display
4.8设置显示选项
(gdb) set print address on/off
(gdb) show print address
(gdb) set print arrray on/off
(gdb) show print array
(gdb) set elements on/off
(gdb) show print elements
(gdb) set print null-stop on/off
(gdb) show print null-stop
(gdb) set print pretty on/off
(gdb) show print pretty
(gdb) set print sevenbit-strings on/off
(gdb) show print union
(gdb) set print object on/off
(gdb) show print object
(gdb) set print static-memebers on/off
(gdb) show print static-members
(gdb) set print vtbl on/off
(gdb) show print vtbl
4.9 显示变量的历史记录
当使用gdb的print查看程序运行时的数据时,每一个print都会被gdb记录下来。gdb会以$1, $2, $3, ......这样的方式为每一个print命令结果
编号。这样就可以使用这个编号访问以前的表达式。
4.10 查看寄存器
(gdb) info registers
(gdb) info all-registers
(gdb) info registers <register-name>
4.11 查看使用gdb环境变量
(gdb) set <expression>
(gdb) show convenience
5. 改变程序的执行
5.1 修改变量的值
(gdb) print <expr>
(gdb) set <expr>
(gdb) set var <expr>:set var命令告诉gdb,程序中的变量名
5.2 跳转执行
(gdb) jump <location>:jump需要指定下一条语句的运行点,可以是文件的行号,可以是file:line格式,可以是+num这样偏移量格式
注意:jump命令不会改变当前的程序栈中的内容。所以,当程序从一个函数跳到另一个函数时,当函数运行完返回并进行弹栈操作时必然
会发生错误,可能结果还会非常奇怪,甚至产生程序Core Dump。因此,最好是在同一个函数中进行跳转。
5.3 信号的产生及处理
(gdb) signal <signum>:使用signal命令,可以产生一个信号给被调试的程序。UNIX的系统信号通常从1到15。signal命令和shell的kill命令
不同,系统的kill命令法信号给被调试程序时,是由gdb截获的,而signal命令发出的信号则直接发给被调试程序的
(gdb) handle <sig-name> <whatodo>:两个参数一个是信号名,另一个是接受到信号时该做什么。有以下几种可能的参数:
nostop:接收到信号时,不要将它发送给程序,也不要停止程序
stop:接收到信号时,停止程序的执行,从而允许程序调试;显示一条表示已接收到信号的消息(禁止使用消息除外)
print:接收到信号时显示一条消息
noprint:接收到信号时不要显示消息(而且隐含着不停止程序运行)。
pass:将信号发送给程序,从而允许程序去处理它、停止运行或采取别的动作。
nopass:停止程序运行,但不要将先好发送给程序
5.4 强制调用函数
(gdb) call func(arg1, arg2, ...)
call和print区别是,如果函数返回void,call不显示,print则显示函数返回值,并把该值存入历史数据中。
5.5 强制函数返回
(gdb) return <value>
如果程序有调试断点在某个函数中,并且还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回,return 命令后面的值会被认作函数的返回值。
6. gdb高级应用
6.1 产生core文件
在gdb运行正常的程序时,在命令号下运行却会出问题,运行后只留下一个名为core的文件。gdb可以载入core文件并检查上次运行死
掉前的程序状态。有的系统版本(例如ubuntu)的默认设置不生成core文件,可以执行如下命令允许生成core文件。
$ulimit -c unlimited
如果要带一个core文件启动gdb,可以通过shell使用命令gdb:gdb filename core
6.2 跟踪栈上数据
每个函数和它的变量都指定了一个frame,而最近调用的函数则在0号frame中(叫做底层frame)。这些frame形成了一个程序运行栈,
要打印此栈,可以使用命令backtrace:
(gdb) backtrace 或 (gdb) bt
(gdb) frame
(gdb) frame up
(gdb) frame down
6.3 绑定运行进程
(gdb) detach:离开进程
(gdb) attach:绑定进程
6.4 源文件搜索
(gdb) search regexp:在当前文件中向下搜索正则表达式
(gdb) reverse-search regexp:在当前文件中向上搜索正则表达式
6.5 机器语言工具
(gdb) info <line/func-name/file:line/file:func-name>:参数可以是源代码的行号、函数名、也可以使用操作符“:”精确定位到某个文件后
再加上行号或函数。结果会显示所指定的源代码在gdb中运行的内存地址。
(gdb) disassemble:来查看当前正在执行源程序的汇编代码,它会把目前在内存中要执行源代码的机器指令显示出来。
6.6 其他有用的调试命令
(gdb) pwd:显示当前工作目录
(gdb) cd:改变当前工作目录
(gdb) quit:退出gdb
(gdb) shell [commandline]:gdb允许在不退出调试环境的情况下运行shell命令
(gdb) show language:查看当前语言环境
(gdb) info frame:查看当前函数的程序语言
(gdb) info source:查看当前文件的程序语言