在gdb中使用C++,直到特定迭代次数继续迭代。

7

我正在使用gdb-7.0.1,我认为我在我的代码的某个部分检测到了一个bug,该部分有一个for循环。这个for循环看起来像这样:

for (int i=0 ; i< end ; ++i )
{
   //Code here.
}

这里的end是一个非常大的整数。代码不会在第一次迭代时崩溃,似乎会在第end/2次迭代时崩溃。
由于我想了解代码在第end/2次迭代时的行为,从i=0开始步进下一步直到达到这个迭代点是不可行的。
有没有办法告诉gdb在for循环中继续执行,直到i的值等于end/2,然后等待用户手动执行第end/2次迭代?
我正在使用Ubuntu Linux上的gcc-4.5.2

http://blog.vinceliu.com/2009/07/gdbs-conditional-breakpoints.html - Karoly Horvath
5个回答

6

这是一篇关于使用gdb实现条件断点的教程。

我猜你可能不知道这个术语,否则就很容易在谷歌上搜索到了。


另一种选择是使用(gdb) ignore <断点编号> end/2-1 - Employed Russian

5

当您设置断点时,它会给您一个断点号码(暂时假设为1)。然后,您将使该断点具有条件,例如:

condition 1 i==end/2

5

1

你应该能够在那里放置一个 if (i == (end/2 -1)) { Foo; },然后在 Foo 处设置断点,这将允许你从那里继续步进。


+1 这曾经是我的方法,直到我发现了 @LuchianGrigore 建议的条件断点。 - Ash Burlaczenko
谢谢,是的,我对gdb不够熟练,没有注意到这一点。我认为这是一个足够通用的解决方案,即使面对更尖锐的问题,也可以保留它。 - Michael Wilson

1
如果end很大(在数万个范围内),那么条件断点解决方案可能会非常慢 - gdb必须每次循环时评估条件。 如果这对您是一个问题,那么您可以使用这个技巧:
for (int i=0 ; i< end ; ++i )
{
   if (i == end/2)
      i %= end ; // This has no effect, but lets you set a breakpoint here
   //Code here.
}

我经常这样做 :-)

另一种解决方案是在断点上设置一个跳过计数。我在Qt环境中使用gdb,所以无法给出gdb语法。但比设置条件更快。


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