gdb调试
最近在重构一个后台模块,原来是使用PHP脚本写的,效率比较低,现在使用C 重构,大量造轮子,很多php功能函数,
只是简单一行的调用,用C却要很多行代码实现,确实很要命,不过逻辑是自己来控制,内存自己申请和释放,效率就是比PHP
快多了,但是写大量C代码,调试的时候,经常Segmentation fault,这个时候就是gdb要出场的时候了,由于gdb有较多命令
过一段时间不用,难免会忘记。索性写在博客里,备忘。
我常用的还是几个命令,break,contiue(c),run(r),backtrace(bt),list(显示行号) ,next(n 下一行),step(s 跳入函数),finish(跳出函数),
print(打印),frame。
总之以上几个命令,用的细,基本上可以快速定位问题
举个例子,目前执行main程序segmentfault
gdb main,有类似错误提示:Program received signal SIGSEGV, Segmentation fault
这样的错误提示基本上没用,直接backtrace 打印堆栈信息
已4层堆栈调用,前两个栈是开源的cJSON库的实现,应该不会出问题,从第3个开始我写的,所以直接frame 3 查看栈信息
发现group结构体的name变量为空。
定位到错误位置,然后该代码吧。查找错误就是这么简单!
下面是gdb常用的命令列表,贴一下
调用运行命令
命令 |
参数含义 |
说明 |
continue |
|
令程序继续运行 |
step |
|
单步步入 |
next |
|
单步步过 |
finish |
|
执行到当前函数代码直到函数返回 |
until |
|
跳出循环,让程序一直执行,直到到达比发出until命令时所在源代码行号更大的位置 |
stdpi |
|
指令级单步步入 |
nexti |
|
指令级单步步出 |
print /f expr |
要打印的表达式。其中f 可以是x十六进制 d 十进制o八进制等等。 |
打印表达式的值,可指定打印格式 |
whatis |
|
查看变量数据类型的简要说明 |
ptype |
|
查看变量数据类型的详细说明 |
x/nfu addr |
要查看的内存地址 |
查看指定内存地址处的数据,可指定模式、长度等 |
Info registers |
|
查看CPU寄存器 |
补充:
Step命令,如果step命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。通常把step称为步入命令。这也是与next命令的区别。
其它命令:
命令 |
参数含义 |
说明 |
display |
|
设置自动显示列表,不带参数时显示列表中所有表达式 |
delete display dnums….. |
自动显示列表的ID号 |
删除自动显示列表 |
disable dislay dnums….. |
自动显示列表的ID号 |
禁用自动显示列表 |
enable display dnums….. |
自动显示列表的ID号 |
使用自动显示列表 |
info display |
|
显示自动显示列表中的表达式 |
show convenience |
|
显示快捷变量 |
macro expand expression |
包含宏定义的表达式 |
将表达式宏展示 |
info macro macroname |
宏定义的名字 |
查看宏定义的信息 |
generatre-core file |
|
产生转储文件 |
backtrace |
n 最内层的n个函数栈帧 -n 最外层n个函数栈帧 |
栈帧回溯 |
frame |
栈帧号或者内存地址 |
选定栈帧,不带参数时显示栈帧简要信息 |
up |
栈帧号 |
选定栈帧上移 |
down |
栈帧号 |
选定栈帧下移 |
info frame |
|
显示栈帧详细信息 |
info agrs |
|
显示当前选定栈帧的函数参数 |
info locals |
|
显示当前选定栈帧中的所有局部变量 |
set variable expr |
赋值表达式 |
给变量赋值或者修改变量的值 |
|
赋值表达式 |
给变量赋值或者修改变量的值 |
jump |
|
使程序从另外的地址开始执行 |
signal sig |
信号值或者信号和名称 |
向被调试程序发送信号 |
call expr |
包含函数调用的表达式 |
调用函数 |
print expr |
包含函数调用的表达式 |
调用函数 |
list |
函数名 行号 地址 偏移等 |
列出程序源码 |
set listsize count |
|
设置 list默认显示的行数 |
disassemble |
|
反汇编被调试程序 |
set disassembly-flavor instruction-set |
|
设置反汇编格式 |