引言
在linux上编程出现段错误非常普遍,可以使用printf
的方法进行打印错误信息,也可以使用gdb调试程序。gdb是gnu下的debug工具,默认就是安装的。这是我在进行一个CV库优化的过程中遇到段错误的时候,无法定位到具体的位置,就硬着头皮去学习了gdb. 以前只是听说过gdb, 没有用过,用过之后觉得原来常用的就是那几个命令,比windows下的IDE上手快多了。
gdb常用命令
run
启动程序运行
next
单步执行(不到函数内部)
step
单步执行,跟踪到函数内部
finish
继续执行,直到当前函数结束
continue
继续执行,直到下一个断点
jump 9
直接跳到指定行
where
有时迷茫了自己处在什么堆栈的深处,这是使用where命令能够清晰的看到自己的位置,有时在循环太多让人受不了了,可使用u或者finish或者jump命令来跳出去。
list 显示源码
l 3,10
显示特定范围的源码 l main显示函数的源码
set listsize 50
修改源码显示行数
break 设置断点
b main
设置函数断点
b 9
设置指定行断点
b
将下一行设置为断点
b test if a == 10
设置条件断点
delete 删除断点
d 3
删除指定的断点
condition
修改条件 condition 4 a == 90
info 查看信息
info threads
查看线程信息
info breakpoints
查看断点信息
info locals
显示局部变量
info args
显示函数变量
info registers
显示寄存器数据
thread 2 切换线程
where
查看调用堆栈(bt 或者 info s)
frame
查看当前堆栈帧
frame 8
查看指定堆栈帧信息
info frame
查看当前堆栈帧更详细的信息
print a 打印变量信息
print/x a
十六进制输出变量信息
print a + b
可以进行表达式计算
print $eax
显示某个寄存器的数据
x/nfu 0×300098 显示指定地址的内存数据
n 显示内存单位,长度 f 格式(除了 print 格式外,还有 字符串s 和 汇编 i) u 内存单位(b: 1字节; h: 2字节; w: 4字节; g: 8字节)
set vairiable a = 100 可以修改变量的值
commands 指定到了特定断点后执行的命令序列
奇淫技巧
cat ~/.gbinit
gdb会从这个文件读取配置
cat ~/.gdb_history
呵呵,对于gdb时想要查看长的字符串老是显示不全,怎么半呢,gdb参看数组字符串时默认只是显示部分的数据,通过这个命令可以修改:
set print elements 0
默认这里设置是200,设置为0表示没有限制
whatis buf
显示变量的类型
dump memory
输出文件名 内存起始地址 内存终止地址
restore 文件名 binary 起始位置
watch buf
buf的值一旦改变,会触发watchpoint
还有其它一些set命令可以试试:
set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的
set print object <on/off>
在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。这个选项默认是off
show print pretty
查看GDB是如何显示结构体的
set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的
set print null-stop <on/off>
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off
set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮
set print union <on/off>
设置显示结构体时,是否显式其内的联合体数据。例如有以下数据结构
p string+n
显示偏移n后的字符串内容,这个使用起来也是比较方便的
参考资料
|版权声明:本文为博主原创文章,未经博主允许不得转载。