-g
选项
生成Debug模式下的文件:gcc -o process-Dubeg process.c -g
我们发现Dubge文件体积比release文件体积要大一些,因为Debug文件里面多了调试信息并且我们会发现,Dubge文件和release文件都可以运行
readelf process.exe-Debug -S//查看一个可执行程序对应的二进制文件
readelf process.exe-Debug -S | grep debug//将二进制文件中和debug有关的部分过滤出来
为了演示gdb命令的使用方法,以下面这个代码为例:
#include<stdio.h>
int AddToTarget(int start,int end)
{
int i=start;
int sum=0;
for(;i<=end;i++)
{
sum+=i;
}
return sum;
}
int main()
{
printf("run begin...\n");
int res=AddToTarget(1,100);
printf("%d\n",res);
printf("run end...\n");
return 0;
}
~
gdb binFile
进入gdb环境,其中binFile
是一个可执行程序q
或者quit
指令可退出list
或者l
:现实binFile
源代码,接着上次的位置往下列,每次10行。l num
或者list num
:num是行号,将源代码的第num行在中间位置显示,每次10行。l Fun_name
或者list Fun_name
:Fun_name是函数名,列出某个函数的源代码l 文件名:num/Fun_name
或者list 文件名:num/Fun_name
Tip: gdb会默认记录上一步操作,如果想要显示整个文件内容,首先可以从最开始显示l 0
,紧接着直接l
,每次显示10行,直到结束为止。此时就把所有内容显示出来了。或者l 0
之后,连续按Enter
键,直到完全显示。
run
或者r
:运行,类似于VS中的F5程序正常执行,这里程序只是运行,无法调试
b num
或者b Fun_name
:打断点,可以在行号num处打断点,可以在名为Fun_name的函数处打断点。另外,断点只能一个一个打。info b
或者i b
:查看断点信息d num
:num为断点编号disable num
:num为断点编号,忽略某个断点,即关闭某个断点enable num
:num为断点编号,启用该断点n
或next
:逐过程,单条执行,当有函数调用时,不会进入函数内部。s
或step
:逐语句,进入函数调用p 变量
:打印变量的值和地址display 变量名
:跟踪查看一个变量,每次停下来都显示它的值undisplay num
:取消对先前设置的那些变量的追踪,其中num是先前设置的跟踪变量所对应的编号
until x
:跳至x行,可以让我们快速的运行代码块
finish
:执行完当前函数返回,然后停下来等待命令
continue
或c
:从当前断点直接运行到下一个断点处
set var
:修改变量的值。
bt
:查看各级函数调用及参数。