1、程序的发布方式有两种,debug模式和release模式
2、gcc/g++形成的可执行程序默认是release模式
3、要使用gdb调试,必须在源代码生成可执行程序的时候, 加上 -g 选项
命令:gcc test.c -o test?-g
?
很明显可以看出debug模式下的文件比release模式下的文件要大?
4、读取可执行程序的数据段格式命令:readelf -S + 可执行程序名
?
对比release模式,很明显debug模式下多出来了许多调试信息
用于调试的代码?
#include <stdio.h>
int AddToTop(int top)
{
int res = 0;
for(int i = 1; i <= top; i++)
{
res += i;
}
return res;
}
int main()
{
int top = 100;
int result = AddToTop(top);
printf("result:%d\n", result);
return 0;
}
gdb + 可执行程序
或者
gdb -q + 可执行程序
-q选项可以屏蔽一些gdb版本等相关信息。
可以输入quit进行退出,也可以使用快捷键Ctrl+d
输入list或者l即可显示代码,一次显示10行代码
gdb会记录最近一次的命令,如果命令无变化,可以直接回车
?
list/l 行号:接着上次的位置往下列,每次列10行。
ist/l 函数名:列出某个函数的源代码。
?输入run或者r开始运行程序,如果有断点则运行到断点处,如果没有断点,就直接运行结束。
break/b + 行号:在某一行设置断点
break/b + 函数名:在某个函数开头设置断点?
??info b:查看断点信息
?d/delete + 断点编号:删除断点
断点编号是在查看断点信息中的Num值。
?n/next:逐过程,相当于VS2022中的F10
?
它会跳过空行,直接跳到有代码的那一行
p/print + 变量名:打印变量内容
s/step:逐语句,相当于VS2022中的F11?
bt/breaktrace:查看当前的调用堆栈
finish:将当前函数跑完就停下来?
display + 变量名:?跟踪查看一个变量,每次停下来都显示它的值
undisplay + 编号:取消对先前设置的那些变量的跟踪
until + 行号:跳转至指定行
?
continue/c:运行至下一个断点处停下来?
类似于你在VS2022上打了多个断点,按F5就可以运行到各个断点处。
disable + 断点编号:禁用断点
enable + 断点编号:启用断点
执行这个命令并不会删除断点,只是断点使不使能的问题。
set var + 变量名:设置该变量为某个值?
?
这次的分享就到这里了,觉得有所收获的话,就给博主三连吧,创作不易,你的支持将是我的动力?
谢谢!!!?