2009-06-22 41 views
16

Esiste un modo per generare una traccia di chiamata per un particolare thread in java?Call trace in java

Non voglio una traccia di stack. Vorrei una sequenza di chiamate su ciascun oggetto per la traccia.

risposta

10

C'è btrace, che può essere utilizzato per questo tipo di azione.

2

Runtime.traceMethodCalls(), che stampa una linea per ciascuna chiamata di metodo di tutti gli oggetti in tutte le discussioni

+0

di hotspot di Sun sulle finestre non sembra uscita le chiamate di metodo di traccia. Ho letto che devo eseguire java debug con 'java_g'. Qualche idea? – JavaRocky

+0

Sì, per me 'Runtime.getRuntime(). TraceMethodCalls (true);' non fa nulla anche. Devo passare argomenti a 'javac' o' java'? –

+0

Ancora non a partire dalla versione java "1.8.0_111" –

2

Si sarebbe fondamentalmente desidera programmazione orientata agli aspetti di una qualche forma, dove l'aspetto potrebbe determinare se il thread corrente doveva essere registrazione chiamate. (L'alternativa è quella di mettere in modo esplicito la registrazione in ogni metodo di te stesso, che sarebbe doloroso.)

Ci sono un sacco di quadri AOP in Java, come ad esempio AspectJ e Spring (primavera è molto di più di AOP ovviamente).

L'applicazione di aspetti a ogni chiamata di metodo nel sistema potrebbe essere complicata però ... Non ho alcuna esperienza con AspectJ, ma Spring AOP è fondamentalmente progettato per abilitare AOP attorno ai componenti. Le classi che sono effettivamente sconosciute a Spring non possono essere cambiate facilmente. Intendiamoci, è passato un po 'di tempo da quando ho usato Spring AOP - le cose potrebbero essere arrivate da allora :)

2

Potremmo creare un nuovo oggetto Throwable che avrà la traccia di chiamata. E usando alcune manipolazioni di stringhe, possiamo ottenere lo stack di chiamate.

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

Non sono sicuro di recuperare le informazioni in questo modo, è una buona pratica o no. :)

+1

Dolorosamente lento, quindi da utilizzare per la localizzazione locale durante il debug. – glmxndr

13

Penso che potresti trovare interessante. È un agente java che aggiunge la registrazione di entrata e uscita ai metodi, utilizzando il framework slf4j per registrare effettivamente l'output. Poi si tratta di configurare il quadro di registrazione per stampare solo quel filo sei interessato a

http://www.slf4j.org/extensions.html#javaagent

(solo per essere esplicito: 1). L'ho scritto, 2) funziona per me :))

+1

WOW. Mind = Blown! – JavaRocky

+0

assolutamente meraviglioso! l'ho provato e ha funzionato benissimo :) grazie per questa estensione molto utile! – stratwine

+0

come posso usarlo su progetti Android? – RegisteredUser

3

Se si desidera tracciare l'esecuzione del codice Java, è possibile utilizzare uno strumento denominato InTrace.

NOTA: InTrace è uno strumento gratuito e open source che ho scritto.

1

Il modo più facile di quanto Btrace sta usando HouseMD, è possibile ottenere il da vm here