我的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)
答案 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