Linux应用调试使用gdb和gdbserver命令详解
在Linux系统中,调试一个应用程序是非常必要的,它可以帮助我们找到代码中的bug或者优化代码的性能。本文将详细讲解在Linux系统中如何使用gdb和gdbserver命令来调试一个应用程序,并提供两个示例。
安装gdb和gdbserver
在开始之前,我们需要安装gdb和gdbserver。在Ubuntu系统中,我们可以使用以下命令来安装:
sudo apt-get install gdb gdbserver
使用gdb调试应用程序
- 编译可调试的应用程序
在编译你的应用程序时,需要加上 -g
参数,例如:
gcc -g -o app app.c
- 启动gdb
在终端输入 gdb app
命令启动gdb。
- 设置断点
在gdb命令行中输入 break main
命令来设置断点。
- 运行应用程序
在gdb命令行中输入 run
命令来运行应用程序。
- 查看代码
在运行应用程序时,我们可以通过gdb命令行输入 list
命令来查看代码。
- 触发断点
当应用程序运行到断点处时,gdb会停止程序的执行,并提示你在哪一行代码上触发了断点。
- 调试程序
在断点位置处,我们可以查看变量的值、调用其他函数以及修改变量的值等等。例如,可以使用 print
命令来查看变量的值,例如:
(gdb) print var
$1 = 1
- 单步执行
在gdb命令行中输入 next
命令可以逐行执行程序,并在每行结束时停下来。
使用gdbserver调试应用程序
有时候我们需要在远程机器上调试应用程序,这时我们可以使用gdbserver命令来启动一个调试服务器,并在本地使用gdb连接到远程服务器上进行调试。
- 在远程机器上启动gdbserver
在远程机器上输入以下命令:
gdbserver :1234 app
其中 1234
是gdbserver的端口,app
是你的应用程序的可执行文件。
- 在本地机器上启动gdb
在本地机器上输入以下命令:
gdb app
- 连接到远程gdbserver
在gdb命令行中输入以下命令:
target remote ip:1234
其中 ip
是你远程机器的IP地址,1234
是gdbserver的端口。
- 进行调试
在连接到远程gdbserver后,你可以像在本地一样进行断点设置、代码查看、变量调试和程序执行等操作。
示例1
以下是一个简单的示例程序,它将两个数相加并输出结果:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int a = 1, b = 2;
int result = add(a, b);
printf("result=%d\n", result);
return 0;
}
编译可调试版本:
gcc -g -o add add.c
使用gdb进行调试:
$ gdb add
(gdb) break main
(gdb) run
Starting program: /home/user/add
Breakpoint 1, main () at add.c:11
11 int a = 1, b = 2;
(gdb) list
6
7 int add(int a, int b) {
8 return a + b;
9 }
10
11 int a = 1, b = 2;
12 int result = add(a, b);
13 printf("result=%d\n", result);
14 return 0;
15 }
(gdb) print a
$1 = 1
(gdb) print b
$2 = 2
(gdb) next
12 int result = add(a, b);
(gdb) print result
$3 = 3
(gdb) quit
示例2
以下是一个简单的应用程序,在启动后将等待用户输入一个数字并计算它的阶乘:
#include <stdio.h>
long fact(int n) {
if (n <= 1) {
return 1;
} else {
return n * fact(n - 1);
}
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
printf("Factorial of %d is %ld\n", n, fact(n));
return 0;
}
编译可调试版本:
gcc -g -o fact fact.c
使用gdb进行调试:
$ gdb fact
(gdb) break main
(gdb) run
Starting program: /home/user/fact
Enter a number: 5
Factorial of 5 is 120
[Inferior 1 (process 27957) exited normally]
(gdb) quit
使用gdbserver在远程服务器上进行调试:
在远程服务器上启动gdbserver:
$ gdbserver :1234 fact
Process fact created; pid = 27602
Listening on port 1234
在本地机器上连接到远程gdbserver并进行调试:
$ gdb fact
(gdb) target remote 192.168.1.100:1234
Remote debugging using 192.168.1.100:1234
0x00000000004006c5 in main () at fact.c:14
14 scanf("%d", &n);
(gdb) print n
$1 = 0
(gdb) break fact
Breakpoint 1 at 0x40066d: file fact.c, line 4.
(gdb) next
6 if (n <= 1) {
(gdb) print n
$2 = 5
(gdb) next
8 return n * fact(n - 1);
(gdb) next
6 if (n <= 1) {
(gdb) next
8 return n * fact(n - 1);
(gdb) print n
$3 = 4
(gdb) next
6 if (n <= 1) {
(gdb) continue
Continuing.
Factorial of 5 is 120
[Inferior 1 (Remote target) exited normally]
(gdb) quit
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux应用调试使用gdb和gdbserver命令详解 - Python技术站