首先我们写一段累加的源代码,用于调试
gdbtest.c
#include
int AddToTop(int top)
{
int res = 0;
for(int i = 0; i <= top; i++)
{
res += i;
}
return res;
}
int main()
{
int result = 0;
int top = 100;
result = AddToTop(top);
printf("%d\n",result);
return 0;
}
在使用gdb
调试之前,必须先形成可执行程序:
gcc gdbtest.c -o gdbtest
接下来使用gdb调试此可执行程序
gdb gdbtest
小贴士:
如果没有安装过gdb,可执行如下命令安装yum -install gdb
但提示当前程序没有调试信号被发现,这是因为gcc生成的可执行程序默认是release
版本的,但如果要调试,必须是debug
版本的
提示:可输入quit退出gdb
所以,我们使用**-g**选项,让gcc生成debug
版本的程序
gcc gdbtest.c -o gdbtest_g -std=c99 -g
可以发现,debug版本的可执行程序会比release大一点。
为了更直观的看到多出来的那一部分:
可使用如下指令以段的方式读取可执行程序:
readelf -S gdbtest
![]()
如果去读debug版本的,可以发现有一些关于debug的信息,但是release版本的并没有
![]()
接下来,我们使用gdb打开debug版本的程序
gdb gdbtest_g
显示代码
list/l
可使用list
(或简写为l
),显示源代码
后面可以加数字,代表从第几行开始显示
后面可以加函数名,如main
,代表显示此函数
在当前状态下直接输入回车,会继续上一条命令,把剩下的代码显示出来
打断点
break/b
使用break(可简写为b)打断点
if 判断语句
,添加条件断点(如:b 8 if i == 20
,表示如果i = 20,在20行停止)info b
删除断点
delete/d
后面加断点的编号
运行到断点
run/r
从一个断点运行到下一个断点
continue
查看变量值
print/p
display
后面直接加查看的变量名,如:p result
但是,如果继续执行,这个变量就不能持续监视了,所以使用display 变量名
,就会常显示此变量
如果要去掉某个常显示:
undisplay 编号
如:undisplay 1
逐语句执行(会跳入函数内部)
step/s
逐过程执行(遇到函数调用不会进入函数内部,直接执行完整个函数)
next/n
注意:如果函数内部有断点,会在内部的断点处停下来
查看调用堆栈
bt
直接运行到某一行
until 行号
运行完当前函数停下来
finish