2016-03-22 8 views
7

Su Mac OS X, è possibile trovare le sonde HotSpot di esecuzione di programmi Java eseguendo:Come utilizzare le sonde HotSpot DTrace su SmartOS?

[email protected] ~ (1) % sudo dtrace -ln 'hotspot*:::' 
Password: 
Invalid connection: com.apple.coresymbolicationd 
    ID PROVIDER   MODULE       FUNCTION NAME 
165084 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-clinit 
165085 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-concurrent 
165086 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-end 
165087 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-erroneous 
165088 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-error 
165089 hotspot46  libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-recursive 
... 

Ma se creo un semplice programma Java ed eseguirlo sul SmartOS:

[email protected] ~ % cat Loop.java 
class Loop { 

    public static void main(String[] args) throws InterruptedException { 
     while (true) { 
       Thread.sleep(5000); 
     } 
    } 
} 
[email protected] ~ % javac Loop.java 
[email protected] ~ % java Loop 

ci riesco Trovi eventuali sonde:

[email protected] ~ (255) % pfexec dtrace -ln 'hotspot*:::' 
    ID PROVIDER   MODULE       FUNCTION NAME 
dtrace: failed to match hotspot*:::: No probe matches description 

C'è qualcosa di speciale che devo fare per vederli?

risposta

15

Il problema è che lo SmartOS (e altre varianti illumos - così come i loro cugini Solaris proprietari) il modulo DTrace nella JVM è pigramente caricato (cioè, il DOF stato compilato con -x lazyload). Di conseguenza, le sonde DTrace non vengono caricate fino all'attivazione esplicita. Ci sono due modi per affrontare questo. Il primo è che puoi dire a DTrace stesso di abilitare le sonde specifiche in questione, costringendo il processo di destinazione a caricare le sue sonde. Ciò richiede (almeno) l'ID del processo di destinazione; a divano questo l'esempio fornito nella questione, che sarebbe qualcosa di simile:

% pfexec dtrace -ln 'hotspot*$target:::' -p `pgrep -fn "java Loop"` 

Ciò raccogliere le hotspot (e hotspot_jni) sonde USDT, ma lascia ancora utilizzando l'azione jstack() difficile su una macchina riempita con ignari processi Java. (Ovvero, questo funziona quando si desidera utilizzare le sonde USDT su un processo noto, non quando si desidera utilizzare il profilo helper di ustack in tutti i processi Java.) Se questo è un problema che interessa, nelle varianti illumos (SmartOS, OmniOS, ecc.) È possibile annullare in modo efficace il caricamento lazy delle sonde DTrace (e dello stack helper) utilizzando una libreria di controllo progettata per l'attività. Questa libreria - /usr/lib/dtrace/libdtrace_forceload.so e la sua variante a 64 bit, /usr/lib/dtrace/64/libdtrace_forceload.so - forzerà efficacemente il caricamento delle sonde DTrace all'avvio del processo, fornendo sonde USDT e l'azione jstack() per tutti questi processi. Per fare questo per JVM a 32 bit, avviare java con l'ambiente LD_AUDIT_32 variabile impostata:

export LD_AUDIT_32=/usr/lib/dtrace/libdtrace_forceload.so 

Per JVM a 64 bit:

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