Нативный код - как программно получить стек вызовов функций (backtrace) - PullRequest
23 голосов
/ 10 октября 2011

У меня есть кодовая база C ++, работающая на Android, и я хочу, чтобы пользователи отправляли отчеты о сбоях.

Я использую библиотеку ACRA , которая отлично работает для кода Java, но когда что-то происходитв нативном коде я не получаю достаточно информации.На самом деле я хотел бы получить трассировку стека вызовов собственных функций.Я знаю, что информация о сбое печатается в logcat после завершения моего процесса, и я могу настроить ACRA для чтения / отправки logcat.Я настроил свой код для обнаружения собственных сбоев, используя обработчики сигналов и обратный вызов Java для создания отчетов ACRA.Он также отлично работает.

Однако при таком подходе есть плохие временные рамки - ACRA читает журналы, пока процесс сбоя еще жив, а Android (не знаю, какая именно часть) записывает отчет о сбое в logcat после завершения завершившегося процесса.,Таким образом, я не получаю трассировки стека при использовании ACRA.

Поэтому я ищу способ программно прочитать текущую трассировку стека из кода C ++ и передать эту информацию в ACRA (или, возможно, другой инструмент отчетов о сбоях)себя.

Все, что мне нужно, это какой-то отчет, записанный в 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

Есть ли способ получить эту трассировку стека из моего кода?

Ответы [ 2 ]

8 голосов
/ 24 ноября 2011

Я сделал это в своем базовом игровом проекте - вы можете увидеть код JNI, который обрабатывает это здесь:

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

, который вызывает метод Java, определенный здесь:

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

Общее решение основано на обработке сигналов, затем в обработчике сигналов запускается вызов java для выгрузки трассировки стека и т. Д. В моем коде я запускаю другое действие, чтобы получить информацию logcat и отправить ее мне по электронной почте.

1 голос
/ 24 ноября 2011

ACRA может перехватить сбой приложения.Затем вы можете создать экземпляр второго процесса, который выполнил бы команду logcat (см. this question ), отфильтровав ее по имени вашего приложения, а затем запустил процесс отправки вам дамп-файла.Это далеко не оптимально, потому что:

  • Приложение, которое будет охватывать logcat, должно иметь разрешения WRITE_EXTERNAL_STORAGE и READ_LOGS
  • Возможно, пользователь будет раздражен необходимостью установить новую программу1008 *

Но я не нашел другой альтернативы для этого.

...