7

我正在使用 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,然后等待用户手动单步执行迭代次数end/2

gcc-4.5.2在 Ubuntu Linux 上使用

4

5 回答 5

6

这是关于使用 gdb的条件断点的教程。

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

于 2012-04-16T18:19:06.730 回答
5

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

condition 1 i==end/2
于 2012-04-16T18:19:29.213 回答
5

您必须使用条件断点。这里有更多关于它的信息:http ://www.cs.cmu.edu/~gilpin/tutorial/#3.4

在 SO 上:当 char* x 指向值等于“hello”的字符串时,如何在 gdb 中设置条件断点?

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

break <line_number> if i==end/2
于 2012-04-16T18:20:25.343 回答
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语法。但这比设置条件要快。

于 2012-04-16T19:26:06.597 回答
1

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

于 2012-04-16T18:19:05.397 回答