当调试充满#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 显示原始源或生成和编译的源,具体取决于实际位置,这通常很好。如果您只想调试其中一个文件(在大多数情况下将是原始源(,则会出现问题。
到目前为止我尝试过的事情:
删除不想跳过的文件。
144 parse.c: No such file or directory.
skip file
GDB何时显示"不需要的"文件。奇怪的是,这导致 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
问题:
- GDB 中是否有一个选项可以只跳过/下一个进入特定文件(在本例中为 parse.y(?
- 是否有选项可以从二进制文件中仅去除parse.c或 parse.y 的调试信息?
理想情况下,回溯bt
和类似命令将仅显示 parse.y。
GDB 没有"跳过除此以外的所有内容"选项。您可以跳过文件和/或函数(可以使用模式(。因此,最好的选择是将文件名(或使用模式(添加到.gdbinit
文件中。
但是通过使用Python API,我们可以用GDB做更多的事情。这个问题有很多有用的信息。特别是,最后一个答案似乎与您想要的非常相似。