【问题标题】: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 方法的类。)一旦有了类,就应该很容易找到实例化。然后它应该很容易跟随线程开始的地方。我错过了什么吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-13
            相关资源
            最近更新 更多