【问题标题】:How to find where a thread was originally started如何找到线程最初开始的位置
【发布时间】:2013-12-02 10:06:01
【问题描述】:

假设我有一个应用程序,如果需要执行任务,它可以产生多个线程......所以没什么特别的。我使用 Eclipse 编写和调试 Java 应用程序。一个线程(我们称之为“异步任务”)在它离开 run() 方法后立即重新生成(因此存在错误,我想找到这种行为的原因)。

我的问题,如果我使用 Eclipse IDE(调试透视图..)暂停这个线程“异步任务”,有没有办法找出这个线程最初是从哪里开始的(例如使用调试视图或任何其他视图)?因为我想知道是谁产生了这个线程(无需进行文本搜索或类似的操作)。

有没有获取这些信息的好方法?

【问题讨论】:

    标签: java eclipse multithreading debugging


    【解决方案1】:

    我会在Thread.start() 处设置一个断点并启用一个条件

    每当启动名为“异步任务”的线程时,条件都会被评估为真,并且调用 start 方法的线程会暂停。然后您可以在堆栈跟踪中看到调用的来源。

    【讨论】:

    • 问题是有几个 .start() 调用,因为它是一个大应用程序,这就是我不想对所有 start() 方法进行文本搜索的原因。
    • 好的,或者你的意思是把这个断点放在 java.lang.Thread 类中?这个可以!
    • @FrecherxDachs 但断点只有在名称等于async task 时才会中断。当然,如果有很多名为异步任务的线程,那么所有线程都会中断,您必须对所有线程进行分析。
    • @FrecherxDachs 是的,这就是我的意思。将断点放在 Thread 类的 start 方法中。
    • 谢谢,我知道条件断点。 “异步任务”只是此问题描述的占位符。
    【解决方案2】:

    在生产中遇到了类似的问题,并编写了一个小型 Java 代理来记录每个线程启动的堆栈。这样系统就可以运行,并且您可以在日志中实时获取信息。当你有很多线程时,这很有帮助。 https://github.com/xdev-software/thread-origin-agent

    【讨论】:

      【解决方案3】:

      您无法使用debuger 来检查新的thread 是否开始,因为debug 将挂起您的整个JVM

      您可以放一些logs 并检查threads 在那里的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 2021-09-20
        • 1970-01-01
        相关资源
        最近更新 更多