我可以在方法条目上暂停 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 运行时以便有时间通过调试器或探查器附加吗?的主要内容,如果未能解决你的问题,请参考以下文章