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

要打印的表达式。其中可以是x十六进制 十进制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

赋值表达式

给变量赋值或者修改变量的值

print

赋值表达式

给变量赋值或者修改变量的值

jump

 

使程序从另外的地址开始执行

signal sig

信号值或者信号和名称

向被调试程序发送信号

call expr

包含函数调用的表达式

调用函数

print expr

包含函数调用的表达式

调用函数

list

函数名 行号 地址 偏移等

列出程序源码

set listsize count

 

设置 list默认显示的行数

disassemble

 

反汇编被调试程序

set disassembly-flavor instruction-set

 

设置反汇编格式

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。