🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
文章目录
一.程序以debug方式发布(默认release)
首先,gcc/g++默认形成的可执行程序是 release的,所以无法直接被调试
gcc -o test-release test.c //release版本
gcc -o test-debug test.c -g //debug 版本
可以看出,debug版本是比release版本大的,release少了调试信息
二、Linux调试器-gdb
1.形成debug文件
gcc -o gdb_test gdb_test.c -g //-g表示以debug形式发布
是debug版本的才能去gdb调试,release是没有调试信息的
2.查看调试信息
readelf -S gdb_test | grep -i debug
//readelf用来显示一个或者多个elf格式的目标文件的信息
//grep -i是过滤的时候忽略大小写
3.进入调试
gdb gdb_test
这叫表明正在调试状态,可以通过q/quit进行退出gdb调试
3.gdb指令的使用
1.list/l 显示
list/l
list/l 某个数字
展示十行,同时,gdb可以记录最近一条命令,如果命令没有变化,可以直接回车,也就是说,输入了l/l 0 之后一直回车就可以显示全部代码了
2.开始调试
r //开始调试,如果没有设置断点,就直接运行直至结束
r只能开始调试并执行到断点处(右端点的话),并不能跳到下一断点,再r一下就结束了
3.设置断点
b 行号 //breakpoint
4.查看断点
info b
5.删除断点
d 断点编号 //info b查看断点的时候,我们可以看到前面有断点编号,如上图
6.逐过程调试
n //next 不进入自定义函数
7.逐语句调试
s //进入自定义函数
8.打印变量内容
p 变量名/print 变量名 //打印变量内容
9.调用堆栈
bt //查看调用堆栈情况
10.跑完当前所在函数
finish //可以打断点跳过也可以finish去跳过
11.长显示(监视窗口)
display XXX //添加 监视对象
display //监视对象添加了之后,想查看的时候就display就行了
12.取消长显示
undisplay 长显示编号 //取消XXX的长显示
undisplay //取消全部长显示
13.跳到指定行
这个命令通常用于在同一个函数中进行循环的跳过,而不建议跨函数
until 行数 //跳到指定行
14.跳到下一个断点
刚刚我们说r进行调试只能调到第一个断点处,再r就执行完了,所以,有了c(continue),进行跳到下一个断点的操作
continue //跳到下一个断点
15.关闭与开启断点
其中,Enb叫做enable,可使用的断点
enable 断点编号(第一列) //开启该断点
disable 断点编号 //关闭断点但不删除
16.调试过程中修改循环的次数
set var 变量名 = X //设置此时变量的值,就可以将循环修改成已经进行了多少次
三、总结
这些指令也不用硬背,在写代码之后,多调试就会了,没必要硬记,一会儿就忘了,下一期更新进程相关的知识,感谢大家的支持!!!