我们如何限制 GDB 仅调试特定源(例如 yacc/lex)以进行步骤 + 后续指令?



当调试充满#line指令的源文件时,调试器会相应地在这些文件之间"切换"。

问题:只有一个文件要调试

示例:作为一个例子,可以使用yacc/bison lex/flex将语法翻译成C源代码。结果是这样的(实际内容与问题无关,这只是我看过的第一个示例(:

case 50:
#line 918 "parse.y" /* yacc.c:1652  */
{
struct my_struct    *p;
p = ppp_define_add (ppp_setvar_list, (yyvsp[-3].s), (yyvsp[-1].s), (yyvsp[0].ui));
if (p) {
ppp_last_entry = p;
}
}
#line 2330 "parse.c" /* yacc.c:1652  */
break;
case 51:
#line 927 "parse.y" /* yacc.c:1652  */
{
struct my_struct    *p;
size_t          size;

当调试这样的代码时,GDB 显示原始源或生成和编译的源,具体取决于实际位置,这通常很好。如果您只想调试其中一个文件(在大多数情况下将是原始源(,则会出现问题。

到目前为止我尝试过的事情:

  1. 删除不想跳过的文件。

    144 parse.c: No such file or directory.

  2. skip fileGDB何时显示"不需要的"文件。奇怪的是,这导致 GDB (8.2.1( 仍然返回到文件,只是输出我们在那里:

157     in parse.c
(gdb) s
159     in parse.c
(gdb) s
160     in parse.c
(gdb) s
161     in parse.c

问题:

  1. GDB 中是否有一个选项可以只跳过/下一个进入特定文件(在本例中为 parse.y(?
  2. 是否有选项可以从二进制文件中仅去除parse.c或 parse.y 的调试信息?

理想情况下,回溯bt和类似命令将仅显示 parse.y。

GDB 没有"跳过除此以外的所有内容"选项。您可以跳过文件和/或函数(可以使用模式(。因此,最好的选择是将文件名(或使用模式(添加到.gdbinit文件中。

但是通过使用Python API,我们可以用GDB做更多的事情。这个问题有很多有用的信息。特别是,最后一个答案似乎与您想要的非常相似。

最新更新