当代码量较多时,使用GDB调试代码可以相对便捷的定位错误点,提高Dbug效率。
首先先熟悉下GDB调试的基本流程:
1. 在编译代码是添加 gcc添加–g选项
:gcc -g test.c -o test.out
2. 然后在bash环境中使用GDB 命令调用编译生成程序:
:gdb ./test.out
进入调试页面
在这个界面下我们可以通过一些GDB的常用命令进行代码的细节调试,常用命令如下:
运行该程序:run(简写r)
查看代码:list(简写l)
打断点:break(简写b)后跟行号(或者函数名、文件名:行号)
查看所有断点:info break
跳转到下一断点处:continue(简写c)
删除断点:delete(简写d)断点编号
单步执行:next(简写n)
进入函数:step(简写s)
查看变量的值:print(简写p)变量名(只显示一次)
查看变量的值,并且使其动态改变:display 变量名(一直显示,并且动态变化)
删除10中变量的显示:undisplay 变量号(非变量名)
跳到某行:until 行号(中途有断点则暂停到断点处)
查看调用堆栈:bt
执行完当前的函数:finish
设置变量的值:set var 变量名 = 值
关闭断点:disable 断点号
开启断点:enable 断点号
执行上一次的指令:Enter按键
退出gdb:quit(简写q)
首先我们可以使用list显示当前程序入口代码:
在调试的关键点上使用break命令添加断点,并是可以使用info break查看断点:
添加断点后可以使用run命令开始运行程序,程序将运行至第一个断点处:
程序运行后使用 print 命令查看当前的变量值
使用 next 命令可以进行单步调试,每次执行一行,同样可以使用print 命令查看变量变化
如果需要重复关注变量值,可以使用display命令这样每次执行暂停后都会自动显示变量值
如果想停止调试,可以执行quit命令退出调试界面。
其他命令大家可以自行尝试,比如continue可以直接从当前位置直接执行到下一个断点处,使用的频率也比较高,这里不在复述。--孟德慧。
在日常调试中,我们经常会遇到段错误。使用gdb可以可以很容易的找到错误的根源。
首先,重新使用–g选项编译出错代码。并正常运行直至其出段错误。测试代码如下:
段错误触发后,同目录下回生成一个core文件,里面保存的是段错误相关信息。如果core文件没有生成,则是因为系统默认core文件大小为0,可以运行ulimit -c 10000来设置core文件容量,然后重新执行程序。
得到core文件后,使用gdb./test core 来查看出错代码所在位置。
并可以执行run命令在gdb调试界面下直接运行程序,使段错误再次出现。
之后执行 pirnt命令来查看出错行相关数值来确认错误信息:确定*p为空指针操作(实际代码中更多的可能是野指针或越界操作)。