2011-10-10 4 views
23

Ho codice C++ in esecuzione su Android e voglio avere rapporti di arresti anomali inviati dagli utenti.Codice nativo: come ottenere la chiamata stack delle chiamate (backtrace) a livello di programmazione

Sto usando ACRA library che funziona bene per il codice Java, ma quando qualcosa si blocca nel codice nativo, non ottengo abbastanza informazioni. In realtà mi piacerebbe ricevere la traccia dello stack delle chiamate di funzione native. So che le informazioni di crash vengono stampate in logcat al termine del mio processo e posso configurare ACRA per leggere/inviare logcat. Ho impostato il mio codice per rilevare l'arresto anomalo nativo utilizzando i gestori di segnale e richiamando Java per il reporting di ACRA. Funziona anche bene.

Tuttavia, questo approccio non funziona correttamente: ACRA legge i registri mentre il processo di arresto anomalo è ancora attivo e Android (non sa esattamente quale parte) scrive il rapporto di arresto anomalo su logcat al termine del processo. Quindi non ricevo tracce di stack quando uso ACRA.

Quindi sto cercando un modo per leggere in modo programmato la traccia dello stack corrente dal codice C++ e alimentare queste informazioni ad ACRA (o magari ad altri strumenti di segnalazione degli arresti anomali).

Tutto quello che serve è un qualche tipo di relazione scritta al logcat:

10-10 08:29:13.868: INFO/DEBUG(1121):   #00 pc 0003fc7c /data/data/com.ex.lib/libapp.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #04 pc 00016df4 /system/lib/libdvm.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #05 pc 00045284 /system/lib/libdvm.so 
10-10 08:29:13.899: INFO/DEBUG(1121):   #15 pc 00047c56 /system/lib/libdvm.so 
10-10 08:29:13.922: INFO/DEBUG(1121):   #16 pc 00030e4c /system/lib/libandroid_runtime.so 

Esiste un modo per ottenere questo stack trace dal mio codice?

risposta

1

ACRA può intrappolare l'arresto anomalo dell'applicazione. È quindi possibile creare un'istanza di un secondo processo che eseguirà il comando logcat (vedere this question), filtrandolo in base al nome dell'applicazione e quindi il processo per inviare il file scaricato. Questo è ben lungi dall'essere ottimale perché:

  • l'applicazione che avrebbe estendersi logcat deve avere le WRITE_EXTERNAL_STORAGE e READ_LOGS permessi
  • Probabilmente l'utente sarebbe infastidito a dover installare un nuovo programma

Ma Non ho trovato un'altra alternativa per farlo.

+0

Può essere una seconda attività definita all'interno del tuo apk - non è necessario installare una seconda app –

+0

Sì, ma questo richiederebbe il READ_LOGS, la strega potrebbe causare qualche sospetto agli utenti – scooterman

8

ho fatto nel mio progetto di base del gioco - si può vedere il codice JNI che gestisce questo qui:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40

che chiama il metodo Java definito qui:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/src/com/gmail/whittock/tom/Util/NativeActivity.java#cl-91

La soluzione generale è basata sulla gestione dei segnali, quindi nel gestore di segnale che attiva una chiamata fino a java per scaricare la traccia dello stack ecc. Nel mio codice, avvio un'altra attività per ottenere le informazioni logcat e mandamelo via email

+0

Non è un po 'spaventoso chiamare il metodo java all'interno del gestore di segnale? – Tapemaster