如何从断点处找到Thread的起始位置

时间:2013-03-27 10:42:55

标签: java multithreading debugging intellij-idea breakpoints

这是我的情况:

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

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

感谢

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

没有

如果没有一些蛮力的努力,我认为没有办法解决这个问题。

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

答案 3 :(得分:0)

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