2016-07-16 5 views
1

Я не могу получить Java-стек с dtrace в экземпляре Joyent SmartOS.DTrace отсутствует фреймы Java с ustack(). Запуск в контейнере инфраструктуры Joyent SmartOS

Я попробовал java:15.1.1 изображение и простое изображение SmartOS 'base64', где я установил OpenJDK 8.

Я самый простой пример: кот 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 

Я добавил libdtrace_forceload.so как recommended.

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

Это 64 бит JVM:

[[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-стеки. Однако JAVA кадры сырые адреса, совершенно бесполезно:

[[email protected] ~]# pgrep -fn "java Loop" 
32597 
[[email protected]7b4fbd9a1de5 ~]# 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* 

я вижу горячих точек Зонды доступны:

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

Вопрос: Есть ли способ, чтобы перечислить ustack помощников, и если они загружены ? Любой способ получить стек Java?

ответ

3

В вашем примере с нетранслированными фреймами стека Java вы, кажется, используете действие ustack(). Чтобы получить перевод кадров, я считаю, что вы должны использовать действие jstack() вместо этого.

+0

Да, должен быть jstack(). Приводит меня на один шаг ближе. Он работает с оракулом JDK, но не с openjdk из java: 15.1.1 – Gamlor