目录
引言
gdb指令
l指令(list)
运行程序:r(run)(运行到断点处停止)
打断点:b(break)
删断点:d(delete)
编辑
调试
监视窗口:指令p(print)
display监视
取消常显示:undisplay
until:在一个函数内,跳转到指定行
finish:直接把一个函数跑完
快速跳到下一个断点C(continue)
禁用断点(不删除):disable + 断点编号
set var :修改变量
bt:显示函数调用信息
显示该函数内的变量:info locals
总结
引言
在软件开发的过程中,调试是不可或缺的一环。它帮助我们定位并修复代码中的错误,确保软件的稳定运行。Linux环境下,GDB(GNU Debugger)是一款功能强大的调试工具,它能够为程序员提供强大的程序执行控制、断点设置、变量检查等功能。熟练掌握GDB的使用,对于提升开发效率、确保代码质量具有重要意义。
在发布的软件,一般分为debug版本和release版本。Linux的程序默认用release发布
Debug:含有调试信息
Release:不含有调试信息
因此调试的必须是debug发布的版本。
用debug发布软件:-g
gdb指令
我们写一个简单的小程序。
l指令(list)
进行代码的显示
打开:gdb + 文件 退出:q
l 0,可以让代码从第0行开始显示,l n同理。
gdb存在记忆功能,直接enter可以执行最后一条指令。
可以看到,展出的代码进行了编行。
l+ 函数名 (只看某一个函数)
运行程序:r(run)(运行到断点处停止)
输出3,正常退出。
打断点:b(break)
有多种打断点的形式
b 行号
b 函数名
b 文件名:行号
b 文件名 : 函数名
info b :查看断点信息
包含:序号、 类型、 开启状态 、地址 等信息
需要注意的是q退掉gdb之后,断点信息将不存在。
b 函数名打断点
删断点:d(delete)
需要注意的是,删除断点,删除的是编号,而不是行号
调试
调试分为逐过程(F10)和逐语句(F11)
对应在gdb中分别为 n(next) s(step)
需要注意的是,只有r指令之后,才能进行调试。
n 命令会进入函数体执行函数,但它不会单步执行函数体内的每一行代码,除非函数体内有断点。如果函数体内没有断点,GDB 会执行完整个函数并停在函数调用后的下一行。
如果函数体内部的断点打在了循环的地方,那么每次执行 n
(或 next
)命令时,GDB 会继续执行到下一个断点,包括循环内的断点
再次r可以重新开始执行
s调试:可以看到给出了作用域,并且进入了函数内部
监视窗口:指令p(print)
缺陷:每次都需要调用p(print)去查看
display监视
当不出本作用域,可以一直监视。
当我们再次run之后,发现进行了display,当进入add作用域之后display失效
出add作用域,display再次生效。
取消常显示:undisplay
需要注意的是,undisplay需要跟展示的编号,而不是变量。
until:在一个函数内,跳转到指定行
until之后,直接省去循环(0 - 9)跳到了15行
finish:直接把一个函数跑完
快速跳到下一个断点C(continue)
如果在两个断点直接出现了报错,就可以确定出错的区间
c 、 finish 、 until帮助我们快速定位区间
禁用断点(不删除):disable + 断点编号
发现断点的状态都是enable状态
禁用断点是disable
enable重新打开
set var :修改变量
set var可以直接将变量修改,可以用于修改循环次数、、、