2011-12-09 13 views
9

Sto scrivendo un'implementazione dell'algoritmo utilizzando Java. Fino a OS X 10.7, ho usato lo Shark Profiler per profilare la mia implementazione, che ha funzionato piuttosto bene. Tuttavia, i nuovi strumenti non trovano più i nomi delle procedure. Ho già provato a eseguire l'applicazione java con gli argomenti VM per lo shark (vale a dire -agentlib: Shark), ma sono sconosciuti a 10.7 e non sono riuscito a trovare un agentlib simile per gli strumenti.Mancanti nomi di procedure JAVA in Time Profiler, Instruments, OS X

Qualche idea su come posso allegare i nomi delle procedure ai nomi dei simboli (che sono alcuni numeri esadecimali) negli Insturments? Sto usando Eclipse Indigo, se questo fa alcuna differenza.

Grazie!

Modifica: Finora, non è cambiato nulla con OS X Mountain Lion.

Edit # 2: Un aggiornamento da uno sviluppatore tramite bug giornalista di Apple (?):

dtrace sostegno ha avuto per Java stack in punti in passato, anche se onestamente non poteva dire se il supporto è stato mantenuto. Potrebbe essere una valida soluzione alternativa per ciò che stai cercando di misurare, che a questo punto non è una priorità per gli strumenti di performance. Puoi iniziare con lo script D in /usr/bin/cpu_profiler.d e modificarlo per raccogliere anche il jstack.

Modifica # 3: Va bene, dopo qualche discussione in più si scopre che lo stesso sviluppatore non sapeva da dove provenisse quella sceneggiatura. Apparentemente, il profiler temporale in Instruments non usa comunque DTrace, quindi l'unica opzione rimasta è scrivere il nostro script o strumento DTrace.

Hai ragione, e mi scuso. Non sono sicuro da dove venisse quella sceneggiatura, e quando l'ho guardata attentamente, non ci sono azioni jstack, quindi non è quello che vuoi comunque. Sembra che l'unica opzione di profilazione java che posso offrirti sia DTrace. DTrace ha un provider di profili e un'azione jstack che raccoglie gli stack java. È possibile utilizzare "aggregati" per determinare le tracce di stack più pesanti e tutto ciò funziona dalla riga di comando. La documentazione di DTrace è gestita principalmente da Sun e vorrei indirizzarti a qualsiasi esercitazione DTrace poiché la maggior parte copre il provider di profili.

Nonostante ciò che la gente dice online, Instruments non usa DTrace per tutto, in particolare la profilazione del tempo, quindi non posso offrirti una soluzione rapida nell'interfaccia utente di Instruments.

risposta

5

Gli strumenti fanno affidamento su un po 'di delizioso software sviluppato da Sun chiamato dtrace. dtrace ha una funzione chiamata 'jstack()' che si suppone stampi una traccia stack con simboli java, c'è anche un 'ustack()' che dovrebbe fare cose simili per altri langauges (python, node.js, ecc.). Sfortunatamente la versione di dtrace di OS X non supporta questi metodi e in quanto tale gli strumenti non forniscono tale funzionalità.

Quindi, sfortunatamente non otterrai queste informazioni da quegli strumenti finché Apple non aggiusterà le loro cose. :(

Seguire questa discussione per ulteriori informazioni: http://www.mail-archive.com/[email protected]/msg04863.html

ho depositato un bug con Apple per quanto riguarda la loro mancanza di supporto per i traccianti pila aiuto, se si desidera che questa funzionalità è necessario un bug troppo: https://bugreport.apple.com

+0

Grande, grazie. Spero che questo venga risolto presto, anche se il bug è in circolazione da un po 'di tempo. Presenterò un bug report. – HdM

+0

Quindi, ho ricevuto un aggiornamento da uno sviluppatore che legge quanto segue: "dtrace ha avuto supporto per stack Java in punti in passato, anche se onestamente non potevo dire se il supporto è stato mantenuto. Può essere una soluzione valida per quello che stai cercando di misurare, che a questo punto non è una priorità per gli strumenti di performance. Potresti voler iniziare con lo script D in /usr/bin/cpu_profiler.d e modificarlo per raccogliere anche il jstack ". – HdM

+0

Sarei molto interessato a sapere se tutto funziona. –

0

Una cosa che mi viene in mente è l'opzione -g al javac compilatore per includere le informazioni di debug. In eclise (almeno in helios) è possibile impostare diverse opzioni per il debug dei dati in 'Compilatore Java', 'Generazione file di classi'. Forse alcune di quelle impostazioni sono state mutilate.

Questo, tuttavia, non risolve il problema con i metodi metodo, che sono sempre inclusi nei file di classe. Tuttavia, i diversi tipi di VM Java eseguono le ottimizzazioni del runtime in modi diversi, come ad esempio la nota sull'affidabilità di stack traces nei documenti.

Pertanto, il passaggio ad un'altra (versione di) VM può avere un impatto sulla capacità del profiler di fare la cosa giusta. - A proposito, non hai "aggiornato" implicitamente la tua versione Java (ad esempio da 1.6 a 1.7) nel processo?

+1

Ho fatto l'upgrade ad una versione non java di Apple, anche se per quanto ne so, questo "bug" è sempre persistito, e i post "worksforme" mancanti indicano che probabilmente non ha nulla a che fare con il vm. Penso che sia più di un problema nel trovare un hook dtace – HdM

0

Se si desidera profilare le applicazioni java, si consiglia di utilizzare Visualvm da Oracle (tramite Java.net).Questo strumento può profilare la memoria e la CPU fino al metodo, anche per JVM remote. Su OSX è ovvio che non fa parte del JDK predefinito, ma è possibile scaricarlo qui: http://visualvm.java.net/download.html Potrebbe essere un'alternativa allo squalo.

+0

Ho provato visualvm, ma sono molto insoddisfatto di esso. Rispetto allo squalo o agli strumenti, è goffo, ha un overhead ridicolo ed è piuttosto difficile t per iniziare, anche con il plugin eclipse. Per me questa non è un'alternativa. – HdM