GDB:只有在命中不同断点后才触发的断点

9

假设我创建了两个断点,分别是2和3。断点3位于第10行,该行代码在程序中经常被执行。如何配置断点3,在断点2被命中一次后才会触发?

2个回答

12

举一个简单的例子:

void bp2() { };
void bp1() { bp2(); }

int main()
{
  bp2();
  bp1();
  return 0;
}

我们可以创建一个断点,只有在通过bp1调用bp2时才会触发,类似以下方式:

break bp1
break bp2

commands 1
silent
enable 2
c
end

commands 2
disable 2
end

disable 2

谢谢回复。有更简单的方法吗? - user1299784
@user1299784 或许你可以通过使用类似于“如果 x == 5 则中断 foo”这样的条件,在我发布的简单代码中实现你想要的效果,而不需要创建状态的参数/变量。我不知道其他方法,但如果你知道在中断 2 被触发之前中断 3 将被触发的次数,那么你可以设置 'n' 为适当的次数(最简单的方法是在 bp1 上设置断点),运行它并使用 "info b" 查看 'already hit n times',如果数字稳定,则说明已经达到了该次数。 - matt
2
你可以使用gdb中的方便变量来创建本地状态,例如"set var $bp1hit = 1"和"break bp2 if $bp1hit"。 - Tom Tromey

0

我想补充一下,在另一个断点的command中也可以创建一个新的断点。

b main.c:12
command 1
  b main.c:10
  disable 1
end

然而,我建议通常使用@matt的方法,因为它更清晰,留下的混淆空间较少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接