是否可以从 GDB 的外部文件中将命令注册到断点?
Posted
技术标签:
【中文标题】是否可以从 GDB 的外部文件中将命令注册到断点?【英文标题】:Is it possible to register commands to a breakpoint from within an external file in GDB? 【发布时间】:2020-10-07 14:22:19 【问题描述】:GDB 允许通过commands NUM
语法将一组命令注册到特定断点。我需要使用类似以下的语法,通过外部文件为特定断点注册命令集:
commands ./main.c:18
silent
print buffer[0]
cont
end
commands ./io.c:29
silent
printf "Hello world %i\n", myvar1
cont
end
commands path/to/file:XX
语法是我自己编的。因为commands NUM
语法中的NUM
准确需要断点的运行时ID 号(由GDB 分配),所以我不能为此目的使用确定性语法。
我目前正在通过具有此类内容的文本文件注册断点:
break ./main.c:18
break ./io.c:29
然后在 GDB 中发出source breakpoints.txt
命令。注册断点的时候好像没有办法同时注册commands
:
(gdb) 帮助中断 在指定的行或函数处设置断点。 break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM] [if CONDITION] 如果命令被放置在一个 探测点。接受的值为
-probe' (for a generic, automatically guessed probe type),
-probe-stap'(对于 SystemTap 探针)或 `-probe-dtrace'(用于 DTrace 探针)。 LOCATION 可以是行号、函数名或“*”和地址。 如果指定了行号,则在该行的代码开始处中断。 如果指定了函数,则在该函数的代码开始处中断。 如果指定了地址,则在该确切地址处中断。 如果没有 LOCATION,则使用所选的当前执行地址 堆栈帧。这对于在返回堆栈帧时中断很有用。THREADNUM 是来自“信息线程”的数字。 CONDITION 是一个布尔表达式。
允许在一个地方设置多个断点,并且如果它们的断点是有用的 条件不同。
问题
-
是否有任何简单的方法可以从文件中为预定断点设置一些预定命令?
如果没有,是否有任何等效方法可以将
(gdb) info breakpoints
输出传递到文件或程序,而pipe
在 GDB(5.3 版)中不可用?目前我正在尝试使用logging
功能来解决此问题:
set logging file /tmp/breakpoints
set logging on
info breakpoints
set logging off
【问题讨论】:
【参考方案1】:有什么简单的方法可以从文件中为预定断点设置一些预定命令吗?
是的:如果你使用commands
没有 NUM
,命令将应用于最后一个断点集。所以你想要这样的东西:
break main.c:18
commands
silent
print buffer[0]
cont
end
【讨论】:
以上是关于是否可以从 GDB 的外部文件中将命令注册到断点?的主要内容,如果未能解决你的问题,请参考以下文章