我正在使用gdb-7.0.1,我想我在代码的某个部分检测到了一个错误
有一个for
循环。 for
循环看起来像
for (int i=0 ; i< end ; ++i )
{
//Code here.
}
这里end
是一个非常大的整数。代码在第一次迭代时不会崩溃,并且似乎在迭代编号end/2
处崩溃。
由于我想要了解代码在迭代编号end/2
的行为,从stepping
开始nexting
和i=0
直到我到达此迭代点,这是不可行的。
有没有办法让gdb
继续通过for循环,直到i
获得值end/2
,然后等待用户手动逐步执行迭代次数{{1} }?
我在Ubuntu Linux上使用end/2
答案 0 :(得分:6)
以下是有关gdb的conditional breakpoints的教程。
我猜你不知道这个术语,否则谷歌会很容易。
答案 1 :(得分:5)
设置断点时,它会给你一个断点号(目前,我们假设它是1)。然后,您将使该断点成为条件,例如:
condition 1 i==end/2
答案 2 :(得分:5)
您必须使用条件断点。以下是它的更多信息:http://www.cs.cmu.edu/~gilpin/tutorial/#3.4
在您的情况下(未经测试):
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语法。但它比设定条件更快。