继续使用C ++进行迭代,直到gdb中的特定迭代次数

时间:2012-04-16 18:15:49

标签: c++ gdb

我正在使用gdb-7.0.1,我想我在代码的某个部分检测到了一个错误 有一个for循环。 for循环看起来像

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

这里end是一个非常大的整数。代码在第一次迭代时不会崩溃,并且似乎在迭代编号end/2处崩溃。

由于我想要了解代码在迭代编号end/2的行为,从stepping开始nextingi=0直到我到达此迭代点,这是不可行的。

有没有办法让gdb继续通过for循环,直到i获得值end/2,然后等待用户手动逐步执行迭代次数{{1} }?

我在Ubuntu Linux上使用end/2

5 个答案:

答案 0 :(得分:6)

以下是有关gdb的conditional breakpoints的教程。

我猜你不知道这个术语,否则谷歌会很容易。

答案 1 :(得分:5)

设置断点时,它会给你一个断点号(目前,我们假设它是1)。然后,您将使该断点成为条件,例如:

condition 1 i==end/2

答案 2 :(得分:5)

您必须使用条件断点。以下是它的更多信息:http://www.cs.cmu.edu/~gilpin/tutorial/#3.4

在SO:How do I set a conditional breakpoint in gdb, when char* x points to a string whose value equals "hello"?

在您的情况下(未经测试):

break <line_number> if i==end/2

答案 3 :(得分:1)

你应该可以在那里放置一个if (i == (end/2 -1)) { Foo; }然后在Foo设置一个断点,这样你就可以继续从那里踩到它。

答案 4 :(得分: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语法。但它比设定条件更快。