标签:
启动和停止:
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处停止
info break[n]或info breakpoints[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 $eax //以十六进制输出%eax的内容
print /t $eax //以二进制输出%eax的内容
print 0x100 //输出0x100的十进制表示
print /x 555 //输出555的十六进制表示
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 //查看函数堆栈
多线程:
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
thread apply all command 让所有被调试线程执行GDB命令command。
参考资料:
1. 《深入理解计算机系统》(第二版) 机械工业出版社 P175
标签:
原文地址:http://www.cnblogs.com/vincently/p/4812127.html