프로젝트 디버그

네이티브 충돌 디버그

네이티브 크래시 덤프나 Tombstone을 이해하는 데 어려움을 겪고 있다면 유용한 소개인 네이티브 Android 플랫폼 코드 디버깅을 읽어보세요.

일반적인 충돌 유형의 전체 카탈로그와 조사 방법에 관한 자세한 내용은 네이티브 충돌 진단을 참조하세요.

ndk-stack 도구를 사용하면 충돌을 기호화할 수 있습니다. 일반 앱 디버그 문서에 설명된 대로 Android 스튜디오에서 충돌을 디버그할 수 있습니다. 명령줄 사용을 선호하는 경우 ndk-gdb를 사용하면 셸에서 gdblldb를 연결할 수 있습니다.

앱에 Tombstone 트레이스 직접 액세스 권한 제공

Android 12(API 수준 31)부터 ApplicationExitInfo.getTraceInputStream() 메서드를 통해 프로토콜 버퍼로 앱의 네이티브 충돌 Tombstone에 액세스할 수 있습니다. 프로토콜 버퍼는 이 스키마를 사용하여 직렬화됩니다. 이전에는 Android 디버그 브리지(adb)를 통해서만 이 정보에 액세스할 수 있었습니다.

다음은 앱에서 이를 구현하는 방법을 보여주는 예입니다.

ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for (ApplicationExitInfo aei: exitReasons) {
    if (aei.getReason() == REASON_CRASH_NATIVE) {
        // Get the tombstone input stream.
        InputStream trace = aei.getTraceInputStream();
        // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
        Tombstone tombstone = Tombstone.parseFrom(trace);
    }
}

네이티브 메모리 문제 디버그

Address Sanitizer(HWASan/ASan)

HWAddress Sanitizer(HWASan)와 Address Sanitizer(ASan)는 Valgrind와 비슷하지만 Android에서 훨씬 더 빠르고 더 나은 지원을 받을 수 있습니다.

이는 Android에서 메모리 오류를 디버깅하는 가장 좋은 옵션입니다.

Malloc 디버그

네이티브 메모리 문제를 디버깅하기 위한 C 라이브러리의 내장 옵션에 관한 자세한 설명은 Malloc 디버그libc 콜백을 사용한 네이티브 메모리 추적을 참조하세요.

Malloc 후크

나만의 도구를 빌드하려는 경우 Android의 libc에서도 프로그램을 실행하는 동안 발생하는 모든 할당/자유 호출의 가로채기를 지원합니다. 사용법 안내는 malloc_hooks 문서를 참조하세요.

Malloc 통계

Android에서는 <malloc.h>에 대한 mallinfo(3)malloc_info(3) 확장 프로그램을 지원합니다.

malloc_info 기능은 Android 6.0(Marshmallow) 이상에서 사용할 수 있으며 이 기능의 XML 스키마는 Bionic의 malloc.h 헤더에 문서화되어 있습니다.

프로파일링

네이티브 코드의 CPU 프로파일링에 Simpleperf를 사용할 수 있습니다.