参考教程:【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)_gdb教程-优快云博客
1、示例代码:
#include <iostream>
void swap(int* x, int* y)
{
int t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 10;
int b = 20;
std::cout << "a = " << a << ", " << "b = " << b << std::endl;
swap(&a, &b);
std::cout << "a = " << a << ", " << "b = " << b << std::endl;
return 0;
}
2、调试过程
2.1 生成调试文件
g++ -g gcd_test.cpp -o gdb_test
这里需要说明一下,gcd_test.cpp是代码的源文件,gdb_test是生成的debug文件的名字。这是C++文件的编译,对于C文件来说可以使用如下指令:
gcc -g gcd_test.cpp -o gdb_test
2.2 具体调试
进入GDB:
gdb gdb_test
l查看代码,enter键下翻
(gdb) l
第16行设置断点(或者 break 16)
(gdb) b 16
Breakpoint 1 at 0x12b8: file gcd_test.cpp, line 16.
查看断点信息
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000000012b8 in main() at gcd_test.cpp:16
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000000012b8 in main() at gcd_test.cpp:16
运行到结束(有断点的话运行到第一个断点处)
(gdb) r
Starting program: /home/xxx/demo/gdb_test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
a = 10, b = 20
Breakpoint 1, main () at gcd_test.cpp:16
16 swap(&a, &b);
查看信息
(gdb) info locals
a = 10
b = 20
(gdb) info args
No arguments.
(gdb) print a
$1 = 10
进入函数
(gdb) s
swap (x=0x7fffffffdbd0, y=0x7fffffffdbd4) at gcd_test.cpp:5
5 int t = *x;
(gdb) finish
Run till exit from #0 swap (x=0x7fffffffdbd0, y=0x7fffffffdbd4) at gcd_test.cpp:5
main () at gcd_test.cpp:18
18 std::cout << "a = " << a << ", " << "b = " << b << std::endl;
(gdb) n
a = 20, b = 10
20 return 0;
进入到swap函数中,此时不想调试,想先立马看看运行结果,但是此时又已经进入调试了,那么我们就可以使用到【finish】来立马执行完这个函数,然后观察一下结果。可以看到,最后打印出结果的时候a和b的值确实发生了交换。
因为提前看了执行结果,所以我们要重新开始调试,按下【r】即可,它会询问你是否需要重新开始调试,选择y之后就可以重新从16行开始进行调试
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/xxx/demo/gdb_test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
a = 10, b = 20
Breakpoint 1, main () at gcd_test.cpp:16
16 swap(&a, &b);
追踪a, b的值以及地址
(gdb) display a b &a &b
A syntax error in expression, near `b &a &b'.
(gdb) display a
1: a = 10
(gdb) display b
2: b = 20
(gdb) display &a
3: &a = (int *) 0x7fffffffdbd0
(gdb) display &b
4: &b = (int *) 0x7fffffffdbd4
可以看出不能一次性设置多个。
(gdb) s
swap (x=0x7fffffffdbd0, y=0x7fffffffdbd4) at gcd_test.cpp:5
5 int t = *x;
(gdb) n
6 *x = *y;
(gdb) n
7 *y = t;
(gdb) n
8 }
(gdb) n
main () at gcd_test.cpp:18
18 std::cout << "a = " << a << ", " << "b = " << b << std::endl;
1: a = 20
2: b = 10
3: &a = (int *) 0x7fffffffdbd0
4: &b = (int *) 0x7fffffffdbd4
结束!
3、一些命令的记录
可以使用以下命令来查看当前的程序状态:
info locals
:显示当前作用域内的局部变量。info args
:显示函数的参数。print
:打印变量的值。例如,print a
将显示变量a的值。
你还可以使用以下命令来控制程序的执行:
continue(c)
:继续执行程序。next(n)
:执行下一行代码,但如果下一行是函数调用,它将跳过函数调用。step(s)
:执行下一行代码,如果下一行是函数调用,它将进入函数。