Подтвердить что ты не робот

Родительский код - как получить программный стек функций (backtrace)

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

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

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

Итак, я ищу способ программно считывать текущую трассировку стека из кода на С++ и самостоятельно передавать эту информацию в 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

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

4b9b3361

Ответ 1

Я сделал это в своем базовом проекте - вы можете увидеть код 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 и отправить ее мне по электронной почте.

Ответ 2

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

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

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