是否可以从主机中获取容器中的java进程的线程转储?

时间:2017-06-15 12:08:58

标签: java docker docker-container

我的java进程在容器内运行。当然,我可以在主机上看到这个过程并看到它的pid。如果群集上没有安装jdk但是在主机上安装了jdk,我是否可以使用此pid在docker容器中针对java进程从主机运行jstack。顺便说一句,我尝试了它并遇到了以下错误

Attaching to process ID 66367, please wait...
Error attaching to process: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:411)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
at sun.tools.jstack.JStack.main(JStack.java:106)

1 个答案:

答案 0 :(得分:3)

您使用的jstack版本需要来自运行软件的完全相同的JVM版本。

在应用程序容器中运行jstack将起作用。

在激活软件上的远程调试服务器/ jmx后,您还可以在远程调试中运行jstack

另外,如果你的容器没有jstack,你可以运行一个使用相同jvm构建的容器,但是在jvm容器的同一个pid命名空间中运行jstack:

docker run --pid=container:your_app your_jstack_images jstack $in_your_app_container_jvms_pid