GDB 断点的相关设置
本文使用GPT总结了GDB中断点的相关操作,同时从其中提取了本人比较常用的一些操作命令
第一节 为本人亲自总结/摘抄,第二节为GPT生成(高亮部分是本人补充的)
一、省流总结
1.1 设置断点
1.1.1 普通设置
假设是只有一个源cpp文件编译生成的可执行程序,那么最简单的方法就是按照源代码行号打断点。
(gdb) break 12;//等价于b 12;
这样就是在该源文件第12行设置一个断点
1.1.2 按函数设置
(gdb) break main
这会在程序的 main
函数处设置一个断点。
1.1.3 按源文件名:行号设置
如果需要指定断点的具体位置,可以使用文件名和行号。==(可以用来调试多文件项目)==例如:
(gdb) break main.c:10
1.2 断点的暂停/继续 使用
-
使用
disable
命令禁用断点。例如:(gdb) disable 1
这将禁用编号为 1 的断点。
-
使用
enable
命令启用断点。例如:(gdb) enable 1
这将启用编号为 1 的断点。
1.3 断点的删除
-
使用
delete
命令删除断点。例如:(gdb) delete 1
这将删除编号为 1 的断点。
-
如果需要删除所有断点,可以使用:
(gdb) delete breakpoints
-
如果删除一个集合(几到几)的断点可以使用:(参考https://blog.csdn.net/yangzhongxuan/article/details/6901477)
(gdb) delete 2-8
1.4 查看断点
1.3删除断点是根据对应的断点编号来进行删除的,而断点的编号信息的查看也是不可或缺的。
使用 info breakpoints
命令查看所有断点的信息。
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000000911 in main() at array.cpp:12
(gdb)
二、参考的GPT解释
高亮的文字均为本人给GPT补充上去的
GDB(GNU 调试器)中的断点管理是一项非常重要的功能,它可以帮助开发者调试程序。断点的作用是在程序执行到特定位置时暂停,以便检查程序的状态和变量。以下是有关 GDB 断点管理的相关内容:
1. 断点类型
- 断点(breakpoints) :这是最常见的断点类型,用于在程序执行到某个位置时暂停。可以在函数调用前、循环的特定迭代等关键点设置中断,以便检查程序的行为。
- 观察点(watchpoints) :观察点用于监视特定变量或内存位置的值何时被读取或修改。当变量值发生变化时,程序会暂停。
- 捕获点(catchpoints) :捕获点用于捕获异常,例如 C++ 程序中的异常被抛出时,程序会暂停。通过设置捕获点,可以分析异常的根源。
- 中断点(tracepoints) :中断点允许程序继续执行,但会在触发中断点时收集特定的信息。与单纯的断点不同,中断点不会导致程序暂停,而是记录程序此时的状态信息。
2. 操作断点
-
设置断点
-
使用
break
命令设置普通断点。例如:(gdb) break main
这会在程序的
main
函数处设置一个断点。
如果需要指定断点的具体位置,可以使用文件名和行号。==(可以用来调试多文件项目)==例如:(gdb) break main.c:10
也可以通过一个函数名设置断点:
(gdb) break my_function
-
使用正则表达式设置多个函数的断点。例如:
(gdb) rbreak ^my_.*
这将在所有以
my_
开头的函数处设置断点。
-
-
临时断点
-
使用
tbreak
命令设置临时断点。例如:(gdb) tbreak main
这会在
main
函数处设置一个临时断点。临时断点在第一次触发时会被自动删除。
-
-
禁用和启用断点
-
使用
disable
命令禁用断点。例如:(gdb) disable 1
这将禁用编号为 1 的断点。
-
使用
enable
命令启用断点。例如:(gdb) enable 1
这将启用编号为 1 的断点。
-
-
删除断点
-
使用
delete
命令删除断点。例如:(gdb) delete 1
这将删除编号为 1 的断点。
-
如果需要删除所有断点,可以使用:
(gdb) delete breakpoints
-
如果删除一个集合(几到几)的断点可以使用:(参考https://blog.csdn.net/yangzhongxuan/article/details/6901477)
(gdb) delete 2-8
-
3. 查看断点
- 使用
info breakpoints
命令查看所有断点的信息。它会列出示例程序中所有断点的编号、类型、地址、条件、状态等详细信息。如:
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x000055555555519d in main at main.c:10
.breakpoints 1: x/i 0x000055555555519d
0x000055555555519d: mov %edi,-0x4(%rbp)
4. 管理中断点
中断点(Tracepoints)是一种特殊的断点类型,允许您在程序的特定位置收集数据,而无需暂停程序执行。中断点通常用于复杂程序的性能分析或调试。
-
创建中断点
-
使用
trace
命令创建中断点。例如:(gdb) trace main
这会在
main
函数处创建一个中断点。 -
也可以结合其他参数创建中断点。例如,收集特定局部变量的值:
(gdb) trace main (gdb) actions > collect x, y > end
这将收集局部变量
x
和y
的值。
-
5. 断点条件
-
设置条件断点
-
可以为断点添加条件,使其仅在满足特定条件时暂停。例如:
(gdb) break main if x == 10
这个断点仅在变量
x
的值为 10 时暂停。 -
可以使用 C 表达式作为条件。
-
-
修改断点条件
-
使用
condition
命令修改断点条件。例如:(gdb) condition 1 x < 0
这会将编号为 1 的断点条件修改为
x < 0
。
-
6. 忽略断点
-
使用
ignore
命令告诉 GDB 忽略断点的第一次触发。例如:(gdb) ignore 1 10
这将导致编号为 1 的断点在前 10 次触发时被忽略。
7. 断点调试流程
-
当程序在断点处暂停后,您可以使用以下命令调试程序:
-
查看变量值 :使用
print
命令查看变量的值。例如:(gdb) print x
-
单步执行 :使用
next
或step
命令单步执行程序。next
命令会按行执行,不进入函数内部,而step
命令会进入函数内部。 -
查看调用栈 :使用
backtrace
或bt
命令查看程序的调用栈信息。
-
8. 调试实践
- 在调试时,合理设置断点有助于快速定位问题。例如,如果您怀疑某个函数出现问题,可以在函数入口处设置断点,并使用
step
或next
逐步执行函数代码,观察变量的变化和程序的逻辑。 - 如果问题与循环或条件判断有关,可以设置条件断点,仅在满足特定条件时暂停程序,这样可以避免暂停大量无关的执行步骤。