【发布时间】:2012-01-23 02:45:24
【问题描述】:
在 Eclipse 中调试代码时,我遇到了以下问题。有一个可能有大约 10,000 次迭代的 WHILE 循环。因此,在这里使用 Step 并不是一个好主意。所以,我在这个 WHILE 循环之后放置了断点。但似乎这个 WHILE 循环跑进了内部循环。我不知道如何找到导致此问题的正确迭代。有没有办法区分代码的长执行时间和内部循环?应该怎么做才能快速找到代码中这样的死锁位置?
附:该代码适用于小型数据集...
【问题讨论】:
在 Eclipse 中调试代码时,我遇到了以下问题。有一个可能有大约 10,000 次迭代的 WHILE 循环。因此,在这里使用 Step 并不是一个好主意。所以,我在这个 WHILE 循环之后放置了断点。但似乎这个 WHILE 循环跑进了内部循环。我不知道如何找到导致此问题的正确迭代。有没有办法区分代码的长执行时间和内部循环?应该怎么做才能快速找到代码中这样的死锁位置?
附:该代码适用于小型数据集...
【问题讨论】:
如果你正在寻找死锁,你可以在没有断点的情况下在调试中运行程序并等待它死锁然后停止它。
如果您希望它在特定的迭代中停止,您可以添加条件断点,但这会使执行速度变慢。
我所做的是将条件添加到代码中,例如
if (i == 10000 && condition)
Thread.yield(); // add break point here.
或者如果您有一个返回错误值的方法,您可以执行类似的操作
boolean ok = method();
if (!ok)
method(); // add a break point here so you can see why it fails.
【讨论】:
为测试重写代码 它不是更有可能呈指数级放缓,就像在不断增长的 LinkedList、分配、事务中搜索一样。
if (i > 8000) {
show loop duration; // breakpoint here
} else if (i > 6000) {
show loop duration; // breakpoint here
} else if (i > 4000) {
show loop duration; // breakpoint here
}
所以如果循环变慢,我会引入 StopWatch。使用 findBugs 检查手柄泄漏。最后用更小的方法重写有助于遗留代码。
【讨论】: