2011-10-10 3 views
23

Android에서 C++ 코드베이스를 실행하고 사용자가 보낸 오류 보고서를 갖고 싶습니다.네이티브 코드 - 프로그래밍 방식으로 함수 호출 스택 (백 트레이스)을 얻는 방법

나는 Java 코드에 대해 잘 작동하는 ACRA library을 사용하고 있지만 네이티브 코드에서 문제가 발생하면 충분한 정보를 얻지 못합니다. 실제로 네이티브 함수 호출 스택 추적을 받기를 원합니다. 내 프로세스가 끝난 후 충돌 정보가 logcat에 인쇄되고 logcat을 읽고 보내도록 ACRA를 구성 할 수 있습니다. 신호 처리기를 사용하여 네이티브 크래시를 감지하고 ACRA가보고하기 위해 Java를 다시 호출하도록 코드를 설정했습니다. 그것은 또한 잘 작동합니다.

그러나 ACRA는 충돌 프로세스가 아직 살아있는 동안 로그를 읽으며, 안드로이드는 충돌 한 프로세스가 완전히 끝난 후에 logcat에 충돌 보고서를 기록합니다. 따라서 ACRA를 사용할 때 스택 추적을받지 못합니다.

그래서 프로그래밍 방식으로 현재 스택 추적을 C++ 코드에서 읽고이 정보를 ACRA (또는 다른 충돌보고 도구)에 직접 제공하는 방법을 찾고 있습니다.

내가 필요로하는 모든 로그 캣에 기록이 보고서의 일부 종류 :

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 

내 코드에서이 스택 트레이스를 얻을 수있는 방법이 있나요?

답변

1

ACRA가 응용 프로그램을 트랩 할 수 있습니다. 그런 다음 logcat (this question 참조) 명령을 실행하고 응용 프로그램 이름별로 필터링 한 다음 덤프 된 파일을 보내는 프로세스가있는 두 번째 프로세스를 인스턴스화 할 수 있습니다. 이것은 최적의 거리가 멀다 이유는

  • 로그 캣은 아마 사용자가

그러나 새로운 프로그램을 설치하는 데 짜증이 될 것 WRITE_EXTERNAL_STORAGE 및 READ_LOGS 권한

  • 을 가지고있다 걸쳐있는 것입니다 응용 프로그램 나는 이것을하기위한 또 다른 대안을 찾지 못했습니다.

  • +0

    apk에서 정의 된 두 번째 활동 일 수 있습니다. 두 번째 앱을 설치할 필요가 없습니다. –

    +0

    네, 그렇지만 READ_LOGS가 필요합니다. 마녀가 사용자에게 약간의 의혹을 줄 수 있습니다. – scooterman

    8

    내 게임의 기본 프로젝트에서이 작업을 수행 한 - 당신이 여기에 처리하는 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 정보를 얻기 위해 다른 활동을 시작합니다 이메일을 보내주세요.

    +0

    조금 두려워하지 않습니까? 신호 처리기 내부에서 Java 메소드를 호출합니까? – Tapemaster