在之前学习C语言的的时候出过一期vs的调试技巧。
而对于现在的Linux下的调试器gdb其实也是换汤不换药的,基本上的调试思路是不会改变的,改变的只是工具使用上。
Debug
通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。(可调试)Release
称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。(不可调试)。所以debug版本下是要存放一些调试信息的,侧面说了,debug版本下生成的可执行文件的体积是会更大的。默认执行的是release版本
的,如果要使其执行的是debug版本的话要加上选项-g
gcc -o 生成可执行文件 原文加 -g
sudo yum install -y gdb
指令 | 功能 |
---|---|
list或 l 行号 | 展示所对应的行号的代码 |
b + 行号 / b + 函数名/ b 文件名称:行号 | 给指定行号断点,对一个vs的快捷键F9 |
(delete breakpoints) d + 编号 | 删除指定行号断点 |
info b 或 info break | 查看断点信息 |
run 或 r | 运行代码,对应vs的快捷键F5 |
disable + 断点编号 | 禁用断点 |
enable + 断点编号 | 开启断点 |
next或n | 逐过程调试代码,对应vs的快捷键F10 |
step或s | 逐语句调试代码,对应vs的快捷键F11 |
print§: | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
p + 变量 | 查看变量内容 |
display + 变量 | 长显示变量内容,跟踪查看一个变量,每次停下来都显示它的值 |
undisplay + 编号 | 删除长显示 |
continue或c | 从一个断点运行到下一个断点 |
breaktrace或bt | 调用堆栈。查看各级函数调用及参数 |
finish | 将一个函数运行结束后停止。执行到当前函数返回,然后挺下来等待命令 |
until + 行号 | 在一定范围内,直到运行到指定行号运行停止 |
set var name=value | 修改变量name的内容为value |
quit | 退出gdb |
gdb 可执行文件
进入调试模式
l 行号
但是gdb默认会记住上一次使用的指令
,所以只需要一直按回车就可以直接执行并展示所有的代码。(b 行号/b 函数名/b 文件名:行号)以及(info b)
d 断点编号
d 断点编号 是删除断点信息的。断点编号需要用info b查看断点信息查看。
run或r运行代码
如果有断点,则会运行到断点处停止运行。
disable/enable打开/关闭断点
有的时候我们设置了断点,但是为了测试另一部分代码,可能要删除当前的断点,但是当前的断点可能下次也是需要用到的,于是就可以将断点暂时关闭使用disable,要用到的时候打开断点enable
next或n逐过程编译/step或s逐语句编译
n逐过程编译相当于vs的快捷键F10,进行逐条语句编译。
s逐语句编译相当于vs的快捷键F11,进行逐过程编译。
p 变量名——查看变量内容
用于显示变量的内容,但是缺点是只能显示一次,如果还想再看,只能重新输入指令。
display 变量/undispaly 变量
display——可以长时间显示变量的值,可以进行时事更新变量的值
undisplay——删除长显示变量
continue或n
跳转断点。运行两个端点之间的代码,会从一个断点运行到另一个断点后停止。
bt
调用堆栈。
finish
finish——将一个函数运行完后停止。
有时候我们debug代码的时候,确定了就是在这几个函数中的其中一个函数出错了,这个时候我们就要对函数一一排查,把每一个函数到debug以下。
until 行号
until在一个范围内指定运行到指定的行号。
set var name=value
我们都知道,一个已经运行起来的代码中的变量不能不能别修改了。但是gdb中可以在调试的时候修改这个变量的值。
我在函数部分加上了一个判断结构,正常情况下都是会执行printf(sum)这个函数的。
但是我们可以让它输出haha
这个功能用于我们debug的时候,用来判断语句,但是不知道是哪一部份出错了,就要手动去修改值,让调试的时候进入指定的判断里面去debug,但是有了这个指令就不需要了。
注:这个修改不是本质上的修改,只是名义上的修改,一旦退出被修改的值会恢复原来的值。