是否可以从 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 的外部文件中将命令注册到断点?的主要内容,如果未能解决你的问题,请参考以下文章

从实践到原理掌握 GDB

从实践到原理掌握 GDB

从实践到原理掌握 GDB

从实践到原理掌握 GDB

调试利器GDB-中

调试利器GDB-中