【问题标题】:how to find the place where a Thread was started from a breakpoint如何找到从断点开始线程的位置
【发布时间】:2013-03-27 10:42:55
【问题描述】:
这是我的情况:
- 我正在研究一个大型代码库,在 Java1.7 上运行,不太容易移动,有很多接口,深度继承树,很多线程等。
- 我在某个地方设置了一个断点,但是这个对象在某个地方产生的线程中运行。我需要找到那个地方。
- 有太多 .run() 和 .start() 命中需要单独查找(并且按类缩小范围也很困难,因为有很多类/继承(而且我还不知道代码库) )。
所以我的问题是,有没有办法让线程在断点处停止(intelliJ,但我也可以使用 eclipse)来找出它从哪里开始?
谢谢
【问题讨论】:
标签:
java
multithreading
debugging
intellij-idea
breakpoints
【解决方案1】:
也许您可以将断点放入Thread.start()。
为了避免断点的多次调用,也许用条件逻辑放置断点是有意义的,例如检查全局布尔标志。例如,您怀疑您的代码在某个事件之前调用,当事件发生时,将全局标志设置为 true。
【解决方案2】:
没有。
我认为没有一些蛮力的努力就没有办法解决这个问题。
我会追溯到已启动的 Runnable(通过堆栈跟踪),然后获取该类的继承和接口层次结构,然后在所有这些类上查找 run() 和 start() 方法。除非有人刚刚对继承发疯,否则不会花那么长时间。
【解决方案3】:
中断对象中的代码告诉你它是哪个线程,它的调用堆栈可以告诉你应该寻找哪个Runnable。我假设您已经做到了这一点,并且仅找到对此 Thread/Runnable 的所有引用是不够的。在这种情况下,您可以为java.lang.Thread 编写一个包装类,在run() 中进行instanceof/type 检查并在那里设置断点
【解决方案4】:
我认为首先你必须得到运行的Runnable。这很简单,因为它始终是堆栈跟踪的第一行。 (当然,您需要具体的类,而不是定义 run 方法的类。)一旦有了类,就应该很容易找到实例化。然后它应该很容易跟随线程开始的地方。我错过了什么吗?