前言
在Linux中编程时,需要对程序进行调试。本文以C语言程序举例子,主要介绍如何使用gdb进行调试。程序生成的二进制可执行文件有两种模式:debug模式和release模式,Linux gcc/g++出来的程序,默认是release模式,不能调试。所以要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,这样才能生成的可调试的执行文件。下面以一个例子说明如何生成可执行文件。
操作环境:Xshell 6、腾讯云
1 编写代码
首先创建文件a.c,并编写如下代码:
#include <stdio.h>
void fun1()
{
printf("Hello world!");
}
int main()
{
int arr[10] = {0};
int i = 0;
for(i = 0; i < 10; ++i)
{
arr[i] = i;
}
fun1();
printf("How are you?\n");
printf("I am fine, thank you, and you?\n");
printf("Fine, goodbye!\n");
printf("Bye!\n");
return 0;
}
首先尝试编译程序,并运行:如图1所示,第一步使用ls命令查看当前文件夹中只有源文件a.c。第二步使用gcc命令对源文件a.c进行编译,生成可执行文件ac。接着输入./ac运行程序,可以看到程序的运行结果。
下面对用到的命令功能详细解释:
ls 列出当前目录下的所有子目录与文件。
gcc a.c -o ac -g 把源文件a.c编译生成debug模式的二进制程序,并将该二进制文件命名为ac
./ac 运行可执行文件ac,./ 表示当前文件夹。
2 gdb调试命令
2.1 进入调试和退出调试
在进行调试前首先介绍一下gdb的一些命令,为下文调试打基础。以下命令需要在调试过程中使用,所以要先使用gdb命令进入调试环境,记得要把中括号去掉,下文皆需要去中括号,不再提示。命令如下:
命令:gdb [可执行文件]
当想要退出调试时,按下Ctrl + d或者输入命令quit(简写为q)。
比如我们对上面生成的可执行文件ac进行调试,如图2所示,执行命令:
gdb ac
2.2 调试命令
下文列出了一些常用的调试命令,并进行了简单的介绍,同时在命令后给出了对应命令的简写形式,请注意。
-
list/l :显示10行源代码,每次输入命令list,都会接着上次的位置往下显示。
list命令参数选项:
list [行号n] 显示第n行的上下共十行进行显示。
list [函数名] 列出某个函数的源代码。 -
run/r:开始运行程序。[重要]
-
next/n:单条执行,逐过程执行,不进入子函数内部。[重要]
-
step/s:逐语句执行,进入函数调用[重要]
-
break/b:在某一行设置断点[重要]
break命令参数选项:
break [行号n] 在第n行设置断点
break [函数名]:在某个函数开头第一句程序设置断点 -
info break/i b:查看断点信息 (information breakpoints)
-
print/p:打印表达式的值,表达式可以为变量、指针、对象等,通过表达式还可以修改变量的值或者调用函数
print命令参数选项:(假设我们定义了一个变量a)
print a:打印变量a值。
print &a:打印变量a的地址。
print a=5:将变量a的值修改为5。 -
continue/c:从当前位置开始连续而非单步执行程序
-
delete breakpoints/delete /d:删除所有断点
-
delete breakpoints [n]/delete [n]/d [n]:删除序号为n的断点
-
disable breakpoints/disable:禁用所有断点
-
enable breakpoints/enable:启用所有断点
-
disable breakpoints [n]/disable [n]:禁用第n个断点
-
enable breakpoints [n]/enable [n]:启用第n个断点
-
display [变量名]:跟踪查看一个变量,每次停下来都显示它的值
-
undisplay:取消对先前设置的所有变量的跟踪
-
until [n行号]:跳至n行,即直接执行到第n行
-
breaktrace/bt:查看各级函数调用堆栈及参数(每个子函数都有一个堆栈序号)
-
quit/q:退出gdb
2.3 开始调试
进入调试后,输入list或l查看源代码
首先在第13行和15行设置断点,通过i b命令可以看到断点信息,断点信息的最后的数字代表断点所在的行号。
运行程序
进入子函数fun1内部,退出调试
总结
以上简略较为简单的介绍了使用gdb调试程序的过程,可以供初学者参考。