我正在通过BEA Weblogic Server v9.2运行时环境在Eclipse中启动Weblogic应用程序。如果这是直接从命令行运行,我会执行ctrl-BREAK来强制进行线程转储。有没有办法在Eclipse中做到这一点?
答案 0 :(得分:25)
确实(感谢VonC指向SO线程),Dustin在评论他的消息时指向jstack。
我在Eclipse中运行了一个小的Java应用程序(使用GUI),我可以在Windows的进程管理器中看到相关的javaw.exe及其PID,7088(当然,它在Unix中更简单)。
如果我在命令提示符jstack 7088
处键入,则每个线程都有所需的堆栈转储
凉。
如果我们可以直接从Eclipse那样做,会更好,但这已经很有用了。
答案 1 :(得分:7)
答案 2 :(得分:6)
您可以在调试模式下执行此操作:在调试透视图中转到调试视图,单击您已启动的进程并单击暂停,您将获得所有进程的图形堆栈。
注意:这在使用远程调试时也有效,你不需要从eclipse启动weblogic,你可以自己启动它,打开调试端口并为它创建一个“远程java应用程序调试配置”。
答案 3 :(得分:3)
Eclipse Wiki:How to Report a Deadlock列出了在Eclipse中创建线程转储的所有可能选项。根据具体情况,一个或另一个可能会更好 - 我在Windows上的个人喜爱是Adaptj Stacktrace工具。
答案 4 :(得分:2)
StackTrace是您可以尝试的另一种选择。从功能:
正在运行的Java进程的线程转储 作为 Windows 服务(如Tomcat,for 示例),以 javaw.exe 开头, 在任何浏览器或内部运行的applet JVM嵌入在另一个进程中。 StackTrace适用于Windows,Linux和 Mac OS X。
答案 5 :(得分:2)
如果您更喜欢基于UI的解决方案,visualvm可能是个不错的选择。 (它的优点还在于它与JDK一起分发)
在visualvm中获取线程转储:
Threads
(标签) - > Thread Dump
(按钮)答案 6 :(得分:0)
您是否尝试使用java.exe而不是javaw.exe(在eclipse.ini中)启动eclipse?
这可能会为您提供所需的控制台,如this bug和this message中所述。
其他想法(根据java选项)可以从这个other SO question派生。
答案 7 :(得分:0)
您可以通过JVisualVM进行连接并获取线程转储。只需右键单击Applications树中的应用程序节点,然后选择“Thread dump”
答案 8 :(得分:0)
在linux上至少你可以做一个ps -ef | grep java
来获取PID,然后做一个kill -3 PID
并将它输出到Eclipse控制台。