Código nativo – como obter a stack de chamadas de function (backtrace) programaticamente

Eu tenho C ++ codebase em execução no Android e quero que os relatórios de crashs sejam enviados pelos users.

Estou usando a biblioteca ACRA que funciona bem paira código Java, mas quando algo crash em código nativo, não recebo informações suficientes. Na viewdade, eu gostairia de receber o rastreamento de stack de chamadas de function nativas. Eu sei que a informação de choque é impressa no logcat após o término do meu process, e posso configurair o ACRA paira ler / enviair o logcat. Eu configurei meu código paira detectair crashs nativas usando manipuladores de sinal e voltando a Java paira relatórios pela ACRA. Também funciona bem.

  • Qualquer substituição paira o Bugsense pela ACRA
  • A ACRA pode ser usada em um projeto de biblioteca?
  • O aplicativo Android não iniciairá noClassDefFoundError
  • Logcat vazio usando ACRA no dispositivo
  • Agrupe os rastreios de stack Java / Android em baldes únicos
  • Android: como criair ACRA crash Report Txt File?
  • No entanto, há um tempo ruim com esta abordagem – o ACRA lê logs enquanto o process de crash ainda está vivo e o Android (não sabe exatamente qual pairte) escreve o relatório de crash no logcat após o process interrompido finalizair completamente. Portanto, não recebo vestígios de stack ao usair a ACRA.

    Então, estou procurando uma maneira de ler programaticamente o rastreamento da stack atual do código C ++ e alimente esta informação paira ACRA (ou talvez outra ferramenta de relatório de crashs).

    Tudo o que preciso é algum tipo de relatório escrito paira 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 

    Existe alguma maneira de obter esse rastreamento de stack do meu código?

  • Agrupe os rastreios de stack Java / Android em baldes únicos
  • Qualquer substituição paira o Bugsense pela ACRA
  • Logcat vazio usando ACRA no dispositivo
  • A ACRA pode ser usada em um projeto de biblioteca?
  • Android: como criair ACRA crash Report Txt File?
  • Usando ProGuaird causa NoSuchFieldError paira ACRA
  • 2 Solutions collect form web for “Código nativo – como obter a stack de chamadas de function (backtrace) programaticamente”

    Eu fiz isso no meu projeto de base de jogo – você pode view o código JNI que lida com isso aqui:

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

    que chama o método Java definido aqui:

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

    A solução global é baseada em sinais de manipulação e, em seguida, no manipulador de sinal triggersndo uma chamada até java paira despejair o rastreamento da stack etc., no meu código eu começo outra atividade paira obter as informações de logair e me enviair por e-mail.

    A ACRA pode travair o aplicativo crashndo. Você poderia então instanciair um segundo process que executairia o command logcat (veja esta questão ), filtrando pelo nome do seu aplicativo e, em seguida, tenha o process paira enviair o file despejado paira você. Isso está longe de ser ótimo porque:

    • O aplicativo que abranger o logcat deve ter as permissions WRITE_EXTERNAL_STORAGE e READ_LOGS
    • Provavelmente o user ficairia irritado por ter que instalair um novo programa

    Mas não findi outra alternativa paira fazer isso.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.