2016-07-16 4 views
1

Joyent SmartOS 인스턴스에서 dtrace로 Java 스택을 가져올 수 없습니다. 고양이 Loop.javaDTrace에 ustack()이있는 Java 프레임이 누락되었습니다. Joyent SmartOS 인프라 컨테이너에서 실행

[[email protected] /demo]# cat Loop.java 
class Loop { 

    public static void main(String[] args) throws InterruptedException { 
     while (true) { 
       System.out.println("Sleepy"); 
       Thread.sleep(2000); 
     } 
    } 
} 
[[email protected] /demo]# javac Loop.java 
[[email protected] /demo]# java Loop 

나는 libdtrace_forceload.so 등을 추가 :

은 내가 java:15.1.1 이미지와 내가 오픈 JDK 8

내가 가장 기본적인 예를 설치 일반 SmartOS 'base64로'이미지를, 시도 recommended.

[[email protected] /demo]# java -version 
openjdk version "1.7.0-internal" 
OpenJDK Runtime Environment (build 1.7.0-internal-pkgsrc_2015_05_29_19_05-b00) 
OpenJDK 64-Bit Server VM (build 24.76-b04, mixed mode) 

내가 DTrace를 실행하고, jstack을 사용

, 내가 C-스택을 얻을 :

export LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so 

그것은 64 비트 JVM입니다. ustack 도우미를 나열 할 수있는 방법이 있나요 그리고 그들은로드 된 경우 :

[[email protected] ~]# dtrace -l | grep hotspot | more 
6103 hotspot32597   libjvm.so  _ZN17VM_GenCollectFull4doitEv gc-begin 
6104 hotspot32597   libjvm.so _ZN15VM_GC_Operation13notify_gc_endEv gc-end 
6105 hotspot32597   libjvm.so _ZN26VM_GenCollectForAllocation4doitEv gc-end 
6106 hotspot32597   libjvm.so _ZN35VM_GenCollectForPermanentAllocation4doitEv gc-end 
6107 hotspot32597   libjvm.so  _ZN17VM_GenCollectFull4doitEv gc-end 
6132 hotspot32597   libjvm.so _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread class-initialization-end 
6133 hotspot32597   libjvm.so _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread class-initialization-erroneous 
6441 hotspot_jni32597   libjvm.so    jni_DeleteLocalRef DeleteLocalRef-entry 
6442 hotspot_jni32597   libjvm.so    jni_DeleteLocalRef DeleteLocalRef-return 
6443 hotspot_jni32597   libjvm.so   jni_DeleteWeakGlobalRef DeleteWeakGlobalRef-entry 
6444 hotspot_jni32597   libjvm.so   jni_DeleteWeakGlobalRef DeleteWeakGlobalRef-return 
6445 hotspot_jni32597   libjvm.so     jni_DestroyJavaVM DestroyJavaVM-entry 
6446 hotspot_jni32597   libjvm.so     jni_DestroyJavaVM DestroyJavaVM-return 

질문 : 핫스팟 프로브를 사용할 수 있습니다 참조 할

[[email protected] ~]# pgrep -fn "java Loop" 
32597 
[[email protected] ~]# dtrace -n 'syscall:::entry/pid == 32597/ { @num[ustack(20)] = count(); }' 
dtrace: description 'syscall:::entry' matched 237 probes 
^C 


       libc.so.1`__write+0xa 
       libjvm.so`_ZN2os5writeEiPKvj+0x128 
       libjvm.so`JVM_Write+0x34 
       libjava.so`writeBytes+0x1b5 
       libjava.so`Java_java_io_FileOutputStream_writeBytes+0x1f 
       0xffffbf7ffa612d98 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa606058 
       0xffffbf7ffa6004e7 
       libjvm.so`_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread+0x31d 

*snip* 

: 그러나, JAVA 프레임은 원시 주소는 꽤 쓸모가 ? Java 스택을 얻는 방법은 무엇입니까?

답변

3

번역되지 않은 Java 스택 프레임을 사용한 예에서 ustack() 동작을 사용하는 것으로 보입니다. 프레임으로 번역되었으므로 대신 jstack() 작업을 사용해야합니다.

+0

예, jstack()이어야합니다. 나를 한 걸음 더 가까이 가져와. Oracle JDK에서는 작동하지만 java의 openjdk에서는 작동하지 않습니다. 15.1.1 – Gamlor

관련 문제