赞
踩
目录
- jinfo -flags 666
- Attaching to process ID 666, please wait...
- Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
- sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278)
- at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
- at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
- at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
- at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
- 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.JInfo.main(JInfo.java:138)
- 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:483)
- at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)
- at sun.tools.jinfo.JInfo.main(JInfo.java:76)
- Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
这是因为新版的Linux系统加入了 ptrace-scope
机制. 这种机制为了防止用户访问当前正在运行的进程的内存和状态, 而一些调试软件本身就是利用 ptrace
来进行获取某进程的内存状态的(包括GDB
),所以在新版本的Linux系统, 默认情况下不允许再访问了. 可以临时开启. 如:
1 | echo 0 | tee /proc/sys/kernel/yama/ptrace_scope |
永久写到文件来持久化:
1 2 3 4 | emacs /etc/sysctl.d/10-ptrace.conf 添加或修改为以下这一句:(0:允许, 1:不允许) kernel.yama.ptrace_scope = 0 |
- echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
-
-
- #再次执行时就可以得到结果了
- jinfo -flags 666
- Attaching to process ID 666, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 25.5-b02
- Non-default VM flags: -XX:InitialHeapSize=41943040 -XX:MaxHeapSize=536870912 -XX:MaxNewSize=178782208 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1572864 -XX:OldSize=40370176 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
- Command line: -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 6: Operation not permitted
在docker中出现时:问题分析
发现docker的官方文档提到了,这不是什么 docker 或者jmap的Bug,而是 Docker 自 1.10 版本开始加入的安全特性。 jmap 这类 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而 Docker 自 1.10 版本开始,默认的 seccomp 配置文件中禁用了 ptrace。
加参数 :–security-opt seccomp=unconfined
直接关闭 seccomp 配置或者将ptrace添加到允许的名单中。用法:
- #docker运行时加入“--security-opt seccomp=unconfined”参数
- docker run -d --name ${DOCKER_NAME} \
- --restart=unless-stopped \
- --hostname ${HOSTNAME} \
- --security-opt seccomp=unconfined \
- -p 8803:8803 \
- -v /opt/tcp.jar:/opt/tcp.jar \
- -v /opt/config/:/opt/config/ \
- -v /opt/logs/:/opt/logs/ \
- ImageName:TAG
-
-
- docker官网文档:https://docs.docker.com/engine/security/seccomp/
-
- demo:
- Run without the default seccomp profile
- You can pass unconfined to run a container without the default seccomp profile.
-
- $ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
- unshare --map-root-user --user sh -c whoami
- Attaching to core -heap from executable 7, please wait...
- Error attaching to core file: cannot open binary file
- sun.jvm.hotspot.debugger.DebuggerException: cannot open binary file
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:286)
- at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
- at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
- at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
- at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
- at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
- at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
- at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
- at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
- 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.jmap.JMap.runTool(JMap.java:201)
- at sun.tools.jmap.JMap.main(JMap.java:130)
命令格式不正确导致
- [root@localhost tcp-client1.1]# ../jdk1.8.0_211/bin/jmap 7 -heap
- Attaching to core -heap from executable 7, please wait...
- Error attaching to core file: cannot open binary file
- sun.jvm.hotspot.debugger.DebuggerException: cannot open binary file
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
- at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:286)
- at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
- at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
- at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
- at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
- at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
- at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
- at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
- at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
- 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.jmap.JMap.runTool(JMap.java:201)
- at sun.tools.jmap.JMap.main(JMap.java:130)
使用命令command --help查看命令使用说明
- [root@localhost tcp-client1.1]# ../jdk1.8.0_211/bin/jmap --help
- Usage:
- jmap [option] <pid>
- (to connect to running process)
- jmap [option] <executable <core>
- (to connect to a core file)
- jmap [option] [server_id@]<remote server IP or hostname>
- (to connect to remote debug server)
-
- where <option> is one of:
- <none> to print same info as Solaris pmap
- -heap to print java heap summary
- -histo[:live] to print histogram of java object heap; if the "live"
- suboption is specified, only count live objects
- -clstats to print class loader statistics
- -finalizerinfo to print information on objects awaiting finalization
- -dump:<dump-options> to dump java heap in hprof binary format
- dump-options:
- live dump only live objects; if not specified,
- all objects in the heap are dumped.
- format=b binary format
- file=<file> dump heap to <file>
- Example: jmap -dump:live,format=b,file=heap.bin <pid>
- -F force. Use with -dump:<dump-options> <pid> or -histo
- to force a heap dump or histogram when <pid> does not
- respond. The "live" suboption is not supported
- in this mode.
- -h | -help to print this help message
- -J<flag> to pass <flag> directly to the runtime system
- [root@localhost tcp-client1.1]# ../jdk1.8.0_211/bin/jmap -heap 7
- Attaching to process ID 7, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 25.211-b12
-
- using thread-local object allocation.
- Garbage-First (G1) GC with 63 thread(s)
-
- Heap Configuration:
- MinHeapFreeRatio = 40
- MaxHeapFreeRatio = 70
- MaxHeapSize = 17179869184 (16384.0MB)
- NewSize = 1363144 (1.2999954223632812MB)
- MaxNewSize = 10301210624 (9824.0MB)
- OldSize = 5452592 (5.1999969482421875MB)
- NewRatio = 2
- SurvivorRatio = 8
- MetaspaceSize = 21807104 (20.796875MB)
- CompressedClassSpaceSize = 1073741824 (1024.0MB)
- MaxMetaspaceSize = 17592186044415 MB
- G1HeapRegionSize = 8388608 (8.0MB)
-
- Heap Usage:
- G1 Heap:
- regions = 2048
- capacity = 17179869184 (16384.0MB)
- used = 412985176 (393.85335540771484MB)
- free = 16766884008 (15990.146644592285MB)
- 2.403890108689666% used
- G1 Young Generation:
- Eden Space:
- regions = 44
- capacity = 880803840 (840.0MB)
- used = 369098752 (352.0MB)
- free = 511705088 (488.0MB)
- 41.904761904761905% used
- Survivor Space:
- regions = 3
- capacity = 25165824 (24.0MB)
- used = 25165824 (24.0MB)
- free = 0 (0.0MB)
- 100.0% used
- G1 Old Generation:
- regions = 3
- capacity = 16273899520 (15520.0MB)
- used = 18720600 (17.853355407714844MB)
- free = 16255178920 (15502.146644592285MB)
- 0.11503450649300802% used
-
- 22756 interned Strings occupying 2059192 bytes.
- [root@localhost tcp-client1.1]#
其他参考借鉴:
Docker 中无法使用 JDK jmap之 Can't attach to the process: ptrace(PTRACE_ATTACH问题_russle的专栏-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。