测试环境
gdb 版本: GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
g++版本:g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
测试程序
测试例子 main.cpp
#include <iostream>
int main(int argc, char *argv[])
{
for(int i = 0; i < 100; ++i)
{
std::cout << i << std::endl;
}
return 0;
}
编译以上代码并添加调试信息生成a.out可执行文件
g++ -g3 main.cpp
一、根据文件名和行号设置断点
调试一般情况要定位到代码某一行的位置,进行变量打印输出。gdb可以根据行文件行号进行设置断点。
- 在当前文件设置断点 b 7 //当前文件第7行
- 指定文件和行号设置断点 b filename:linenum
例子下面可以配置tb 或 b 命令设置临时断点或永久断点
二、设置临时断点
如果只想让断点只生效一次,可以使用(gdb) tbreak 缩写为 tb 命令设置临时断点。等效于使用break 缩写(b) 后再手动删除断点。
gdb a.out
Reading symbols from a.out...
(gdb) tb main.cpp:7 //根据文件名和行号 设置临时断点
Temporary breakpoint 1 at 0x11c5: file main.cpp, line 8.
(gdb) r
Starting program: /mnt/g/gdb调试技巧/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdd38) at main.cpp:8
8 std::cout << i << std::endl;
(gdb) c //断点只会生效一次
Continuing.
0
1
2
三、设置条件断点
在调试中,通常需要等待某个特定条件的出现,可以用 b if condition 形式来进行设置条件断点,一般情况需要先设置临时断点,后再根据当前变量设置条件断点。以下操作先程序进入到for 循环中,然后设置条件断点,当 i == 50 时停下。
(gdb) l
3
4 int main(int argc, char *argv[])
5 {
6 for(int i = 0; i < 100; ++i)
7 {
8 std::cout << i << std::endl;
9 }
10 return 0;
11 }
(gdb) info b
No breakpoints or watchpoints.
(gdb) tb main.cpp:7 //设置临时断点
Temporary breakpoint 2 at 0x5555555551c5: file main.cpp, line 8.
(gdb) b if i == 50 //设置条件断点,当 i == 50 时停下
Note: breakpoint 2 also set at pc 0x5555555551c5.
Breakpoint 3 at 0x5555555551c5: file main.cpp, line 8.
...
41
42
43
44
45
46
47
48
49
Breakpoint 3, main (argc=1, argv=0x7fffffffdd38) at main.cpp:8
8 std::cout << i << std::endl;
(gdb) p i
$1 = 50 //条件触发,程序暂停。