我可以在方法条目上暂停 Java 运行时以便有时间通过​​调试器或探查器附加吗?

Posted

技术标签:

【中文标题】我可以在方法条目上暂停 Java 运行时以便有时间通过​​调试器或探查器附加吗?【英文标题】:Can I suspend Java runtime on method entry to have time to attach by debugger or profiler? 【发布时间】:2018-07-17 12:43:55 【问题描述】:

有没有办法在执行某个方法时暂停 Java 进程的所有业务逻辑执行线程?

如果无法通过外部配置,是否有任何方法调用可以嵌入到应用程序中以达到预期的效果?

【问题讨论】:

您可以使用 Object.wait 或 Thread.sleep(ms)。每个都在当前执行的线程上工作。哦等等,我怀疑你不能修改源代码,对吧? 您的意思是要在附加调试器之前等待,而不是附加调试器并等待它到达断点? 我无法从调试器/分析器运行应用程序,但可以附加到进程。 Thread.sleep 不是有效的解决方案。 然后附加到一个进程。设置一个断点,你就可以开始了。不需要你想的任何奇怪的技巧。 【参考方案1】:

根据how to profile application startup with visualvm我可以启动应用程序

-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

在应用启动时停止执行。

也许可以设置断点并移动到有趣的应用程序状态,然后附加分析器并再次启动应用程序。

另一种选择是从 Java 代理开始:https://visualvm.github.io/startupprofiler.html

【讨论】:

【参考方案2】:

一种解决方案是将此代码放在您要调试的方法之前: System.out.println("Press Any Key To Continue..."); new java.util.Scanner(System.in).nextLine(); 这会一直等到您按 Enter 键,因此您有时间附加调试器。

另一种方法是使用 IDE Netbeans,它包含一个调试器并允许您在任何地方设置断点。

【讨论】:

我可以用-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y 启动Java 进程。但是其他工具可以附加到这个过程中进行检测吗? @gavenkoa 这就是重点。你试过用调试器连接那里吗?

以上是关于我可以在方法条目上暂停 Java 运行时以便有时间通过​​调试器或探查器附加吗?的主要内容,如果未能解决你的问题,请参考以下文章

触摸时暂停 UIScrollView 的滚动

如何暂停整个程序的执行,直到在 JAVA 中按下按钮?

如何暂停 Spark 集群上的作业以及如何恢复它?

导航“后退”按钮暂停,以便在弹出之前做一个快速动画

播放或暂停视频时防止暂停

java变量参数列表中至少需要一个元素