
Linux GDB调试实例详解
在Linux系统下,GNU Debugger(GDB)是一款功能强大的调试工具,广泛应用于C、C++及其他编程语言的程序调试
GDB能够帮助开发者在程序运行时监控每一个细节,包括变量的值、函数的调用过程、内存中的数据以及线程的调度等,从而快速定位和修复隐藏的错误或低效的代码
本文将通过具体的实例,详细介绍如何使用GDB进行程序调试
一、GDB安装与准备
大多数Linux发行版都预装了GDB
如果没有安装,可以使用包管理器进行安装
例如,在Debian/Ubuntu系统上,可以使用以下命令安装:
sudo apt-get install gdb
在CentOS/RHEL系统上,可以使用以下命令:
sudo yum install gdb
而在Fedora系统上,则使用:
sudo dnf install gdb
在使用GDB进行调试之前,需要在编译程序时添加`-g`选项,以包含调试信息
例如,编译一个名为`start.c`的C程序:
gcc start.c -o start -g
二、GDB基本命令
GDB提供了丰富的命令,用于程序的调试
以下是一些常用的GDB命令:
- `list`(或`l`):查看源码
- `run`(或`r`):运行程序
- `break`(或`b`):设置断点
- `info break`:查看断点信息
- `next`(或`n`):单步执行,不进入函数内部
- `step`(或`s`):单步执行,进入函数内部
- `print`(或`p`):打印变量的值
- `continue`(或`c`):继续执行程序,直到遇到下一个断点
- `finish`:执行到当前函数返回,然后停下来等待命令
- `quit`(或`q`):退出GDB
三、GDB调试实例
1. 调试一个简单的程序
首先,我们来看一个简单的C程序`start.c`:
include
int main() {
int s = 0;
for(int i = 1; i <= 1;i++){
s = i + s;
}
printf(%d
, s);
return 0;
}
编译并运行GDB:
gcc start.c -o start -g
gdb start
进入GDB调试环境后,可以使用以下命令进行调试:
(gdb) list //列出源码
1 #include
2
3
4
5 intmain()
6 {
7
8 int s=0;
9 for(int i=1;i<=1;i++)
10{
(gdb) list
11
12 s=i+s;
13}
14
15 printf(%d
,s);
16
17 return 0;
18}
(gdb) break 9 //设置第9行为断点
Breakpoint 1 at 0x115c: file start.c, line 9.
(gdb) info break //显示断点信息
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000000115c in main at start.c:9
(gdb) run //运行程序
Starting program: /home/clc/program/start
【Thread debugging using libthread_dbenabled】
Using host libthread_db library /lib/x86_64-linux-gnu/libthread_db.so.1.
Breakpoint 1,main () at start.c:9
9 for(int i=1;i<=1;i++)
(gdb) next //在第一个断点处停止,n相当于next,单步执行
12 s=i+s;
(gdb) next
9 for(int i=1;i<=1;i++)
(gdb) print s //显示变量的值
$1 = 1
(gdb) next
15 printf(%d
,s);
(gdb) next
17 return 0;
(gdb) next
18}
(gdb) continue //继续执行
Continuing.
【Inferior 1 (process 5136 exited normally】
(gdb) quit
通过这个简单的实例,我们了解了如何在GDB中设置断点、单步执行和查看变量的值
2. 调试一个包含错误的程序
接下来,我们来看一个包含错误的C程序`bug.c`:
include
include
include
int main() {
int i, len;
charstr【】 = hello;
charrev_string;
len = strlen(str);
rev_string= (char )malloc(len + 1);
printf(%s
, str);
for(i = 0; i < len;i++){
rev_string【len - i】 =str【i】;
}
rev_string【len + 1】 = 0; // 错误:应该是 rev_string【len】 = 0;
printf(the reverse string is %sn,rev_string);
return 0;
}
编译并运行GDB:
gcc bug.c -o bug -g
gdb bug
进入GDB调试环境后,可以使用以下命令进行调试:
(gdb) list
1 #include
2 #include
3 #include
4 intmain()