2016-07-16 6 views
1

Joyent SmartOSインスタンスでdtraceを使用してJavaスタックを取得できません。DTraceにustack()を持つJavaフレームがありません。 Joyent SmartOSインフラストラクチャコンテナで実行する

Iはjava:15.1.1画像とプレーンSmartOS 'BASE64' 画像、Iは8

をOpenJDKのインストールI最も基本的な例を試みた:Iとしてlibdtrace_forceload.soを添加 猫Loop.java

[[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 

recommended

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

これは、64ビットのJVMである:私はDTraceの実行、およびjstackを使用する場合

[[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) 

は、私はC-スタックを取得します。 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

関連する問題