启动和停止:
gdb <gropram> //使用gdb调试program可执行文件,注意在编译时gcc要加入-g参数。
gdb <program> core //用 gdb 同时调试一个运行程序和 core 文件,core 是程序异常终止后 core dump 后产生的文件。
gdb <program> <PID> //如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID。gdb 会自动attach 上去,并调试他。program 应该在 PATH 环境变量中搜索得到。
run或r //运行程序(在此给出命令行参数)
kill //停止程序
显示代码:
list==l
list<linenum> //显示程序第linenum行周围的程序
list<functiont> //显示函数名为function的函数的源程序
list //显示当前行后面的源程序
list- //显示当前行前面的源程序
断点:
break == b
break <function> //在函数function入口处设置断点
break <linenum> //在指定行号停住
break *addreee //在地址address处停止
break <linespc> thread <threadno> //linespc指定了断点在源程序的行号。threadno指定了线程ID。注意,这个ID是线程ID是GDB分配的,你可以通过“info threads"命令查看正在运行中的线程信息。如果不指定thread<threadno>则表示你的断点设在所有线程上面。
info break[n]或info breakpoints[n] //查看断点信息, n表示断点号。如果不加n表示查看所有断点信息。
delete[breakpoints][range] //删除指定的断点,breakpoints为断点号,如果不指定断点号,则表示删除所有的断点。range表示断点号的范围(如:3-7)。其简写命令为d。
恢复程序运行和单步调试:
step<count>或s<count> //单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有 debug 信息。很像 VC 等工具中的 step in。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。
next<count>或n<count> //同样单步跟踪,如果有函数调用,他不会进入该函数。很像 VC 等工具中的 step over。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。
finish //运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u //当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
输出:
print == p
print $eax //以十进制输出%eax的内容
print /x <variable> //以十六进制输出variable的内容
print /t <variable> //以二进制输出variable的内容
print /o <variable> //以八进制方式输出变量variable内容
print /c <variable> //按字符格式显示variable
print /f <variable> //按浮点数格式显示variable
print 0x100 //输出0x100的十进制表示
print /x ($ebp + 8) //以十六进制输出%ebpd 内容加上8
print *(int*) 0xfff076b0 //输出位于地址0xfff076b0
print *(int*) ($ebp+8) //输出位于地址%ebp+8处的整数
x/2w 0xfff0760b0 //检查从地址0xfff076b0开始的双字
x/20b sum //检查函数sum的前20个字节
p *a@len //数组的全部元素,a是数组名,len是数组元素的个数。如果是静态数组的话,可以直接用 print 数组名,就可以显示数组中所有数据的内容了。
检查代码:
disas //反汇编当前函数
disas sum //反汇编函数sum
disas 0x8048397 //反汇编位于地址0x8048397附近的函数
disas 0x8048394 0x80483a4 //反汇编指定地址范围内的代码
查看堆栈信息:
backtrace或bt //查看函数堆栈
backtrace<n>或bt<n> //n是一个正整数,表示只打印栈顶上n层的栈信息;-n表示一个负整数,表示只打印栈底下n层
frame或f //打印当前栈层的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句
frame<n>或f<n> //n 是一个从 0 开始的整数,是栈中的层编号。比如:frame 0,表示最上一层,frame 1,表示栈的第二层;打印的信息和frame相同
info args //打印当前函数的参数名及其值
info locals //打印当前函数所有局部变量及其值
info catch // 打印出当前的函数中的异常处理信息
多线程:
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
thread apply all command 让所有被调试线程执行GDB命令command。
参考资料:
1. 《深入理解计算机系统》(第二版) 机械工业出版社 P175
2. 《用GDB调试调试程序》