gdb 断点调试

发布时间 2024-01-03 18:30:35作者: 橙皮^-^

测试环境

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 //条件触发,程序暂停。