2

这是我的情况:

  • 我正在研究一个大型代码库,在 Java1.7 上运行,不太容易移动,有很多接口,深度继承树,很多线程等。
  • 我在某个地方放了一个断点,但是这个对象在某个地方产生的线程中运行。我需要找到那个地方。
  • 有太多的 .run() 和 .start() 命中需要单独查找(并且按类缩小范围也很困难,因为有很多类/继承(而且我还不知道代码库))。

所以我的问题是,有没有办法让线程在断点处停止(intelliJ,但我也可以使用 eclipse)来找出它从哪里开始?

谢谢

4

4 回答 4

1

也许您可以将断点放入Thread.start().

为了避免多次调用断点,也许用条件逻辑放置断点是有意义的,例如检查全局布尔标志。例如,您怀疑您的代码在某个事件之前调用,当事件发生时,将全局标志设置为 true。

于 2013-03-27T10:58:04.460 回答
0

我认为首先你必须得到Runnable运行。这很简单,因为它始终是堆栈跟踪的第一行。(当然,您需要具体的类,而不是定义 run 方法的类。)一旦有了类,就应该很容易找到实例化。然后它应该很容易跟随线程开始的地方。我错过了什么?

于 2013-03-27T11:09:15.203 回答
0

中断对象中的代码会告诉您它是哪个线程,它的调用堆栈可以告诉您Runnable应该寻找哪个线程。我假设您已经做到了这一点,并且仅找到对此 Thread/Runnable 的所有引用是不够的。在这种情况下,您可以编写一个包装类,用于java.lang.Thread在其中进行 instanceof/type 检查并在run()那里设置断点

于 2013-03-27T10:54:39.997 回答
0

不。

如果没有一些蛮力的努力,我认为没有办法摆脱这种情况。

我将追溯到已启动的 Runnable(通过堆栈跟踪),然后获取该类的继承和接口层次结构,然后在所有这些类上查找 run() 和 start() 方法。除非有人刚刚对继承发疯,否则不应该花那么长时间。

于 2013-03-27T10:54:43.550 回答