目录
1. debug && release
正常gcc编译出的可执行程序是release版本,不能调试,所以我们需要在makefile文件中的make依赖方法处添加 -g 命令,使生成的可执行程序为debug版本,可以被我们调试
gcc默认编译时release方式发布的,无法直接调试,所以如果要被gdb调试,必须debug方式发布,必须再编译时加-g选项
gcc mycode.c -o mycode_debug -g
再使用gdb指令开始调试
使用以下指令可以查看对应文件的二进制信息,release版本没有以下信息,即debug版本比release版本多了可调试信息,可以使用下面的指令来查看该文件是否含有debug信息
readelf -S mycode-debug | grep -i debug
2. 显示代码 list
VS有图形化界面,可以在调试的时候看到代码,而Linux中没有,那么我们要看到可执行程序中的代码就需要用指令来查看,list就是这个功能
list可简写为l
lsit(l) 数字 //表示从第几行开始显示,默认显示10行
或 list 函数名 //找到函数所在位置,并列举附近代码
注意:gdb会自动记录历史命令,所以list之后可以多次回车,默认跟着上一句指令继续往下查看代码
3. 退出调试
如果要退出gdb调试模式,使用quit指令,简写为q
4. 设置断点 break
4.1. 添加断点 break
相对应的VS的F5可以设置断点,那么linux也有设置断点指令
break(b) 行号 //在某一行设置断点
设置断点后,我们还可以使用指令来查看我们设置的断点信息
info break
简写info b
可以直接 b 函数名 ,更方便的添加断点,会直接打到函数第一个语句处
b 函数名
b 函数名:行号
//这里的函数名可以是文件名,可以进行多文件调试
4.2. 删除断点 delete
如果断点设置错了,或者想要删除断点,使用delete指令,可简写为d。但是需要注意的是,不能直接在delete后跟断点所在的行号,而是要跟上断点的编号
注意:如果在调试过程,退出调试,那么之前设置的断点等信息都会消失,所以,如果你还要进行调试,那么不要使用q命令退出gdb调试,继续使用r指令,此时断点等信息都还存在,运行程序即可。
4.3 禁用断点 disable
如果不想让该断点生效,又不想删除该断点,那么可以使用disable指令禁用该断点,disable后跟的是断点编号
4.4 启用断点 enable
4.5. 逐过程调试 next
在到达断点后的VS中,我们应该进行的是F10逐过程或F11逐语句进行调试,相应的,在Linux中,next指令表示逐过程调试,可简写为n
- 在每次执行后,都会显示:断点信息、在哪个函数内、在第几行代码的信息,
- 调试时,空行直接跳过调试 ,所以调试的行号可能不连续
- gdb会自动记录历史命令,所以不用多次n,直接多次回车即可
4.6. 逐语句调试 step
想进入函数内部调试,使用step指令,简写为s
4.7 until
如果进入到了循环里,但是想跳出循环,继续调试,那么使用until指令
4.8 finish
如果想快速结束函数,回到函数调用处,就是用finish指令。例如,程序出现错误,我们要判断错误来自哪一个函数,我们就可以finish来逐步查找哪一个函数出现问题
4.9 continue
如果想从一个断点直接到达下一个断点,那么使用continue指令,可简写为c
4.10 breaktrace
查看堆栈调用情况,可简写为bt
4.11 info
info b //查看断点信息
info locals //类似VS中的自动窗口,查看局部的变量值
5. 查看变量信息 print
使用print指令,可简写为p,后边跟变量名,如果要查看地址,带上&符号
5.1 display
在VS中,我们监控的变量值会随着调试改变,一直被可视化监视。如果Linux只能使用上面的形式查看变量的值,那就显得太不方便了,所以Linux中还有一个可以常显示变量信息的指令——display
display后跟上变量名,或&变量名即可对这些被监视的变量进行编号,每次逐过程或逐语句调试后,都会显示它们的值
5.2 undisplay
如果不想再监视常显示的变量,需要使用undisplay指令,同取消断点一样,后面需要跟编号信息,不能直接跟变量名
6. set var
在调试时,可以使用 set var 指令进行修改变量的值,以达到快速观察函数以该变量值运行的效果
set var 变量名 = xx