프로젝트 디버그
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
네이티브 충돌 디버그
네이티브 크래시 덤프나 Tombstone을 이해하는 데 어려움을 겪고 있다면 유용한 소개인 네이티브 Android 플랫폼 코드 디버깅을 읽어보세요.
일반적인 충돌 유형의 전체 카탈로그와 조사 방법에 관한 자세한 내용은 네이티브 충돌 진단을 참조하세요.
ndk-stack 도구를 사용하면 충돌을 기호화할 수 있습니다.
일반 앱 디버그 문서에 설명된 대로 Android 스튜디오에서 충돌을 디버그할 수 있습니다. 명령줄 사용을 선호하는 경우 ndk-gdb를 사용하면 셸에서 gdb
나 lldb
를 연결할 수 있습니다.
앱에 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를 사용할 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Debug your project\n\nDebug native crashes\n--------------------\n\nIf you're struggling to understand a native crash dump or tombstone,\n[Debugging Native Android Platform Code](https://source.android.com/devices/tech/debug/index.html)\nis a good introduction.\n\nFor a fuller catalog of common types of crash and how to investigate them, see\n[Diagnosing Native Crashes](https://source.android.com/devices/tech/debug/native-crash).\n\nThe [ndk-stack](/ndk/guides/ndk-stack) tool can help symbolize your crashes.\nYou can debug crashes in Android Studio as described in the general\n[Debug your app](/studio/debug) documentation. If you prefer to use the\ncommand-line, [ndk-gdb](/ndk/guides/ndk-gdb) lets you attach either `gdb` or\n`lldb` from your shell.\n\n### Provide apps direct access to tombstone traces\n\nStarting in Android 12 (API level 31), you can access your app's native crash\ntombstone as a\n[protocol buffer](https://developers.google.com/protocol-buffers/) through the\n[`ApplicationExitInfo.getTraceInputStream()`](/reference/android/app/ApplicationExitInfo#getTraceInputStream())\nmethod. The protocol buffer is serialized using [this schema](https://android.googlesource.com/platform/system/core/+/refs/heads/main/debuggerd/proto/tombstone.proto).\nPreviously, the only way to get access to this information was through the\n[Android Debug Bridge](/studio/command-line/adb) (adb).\n\nHere's an example of how to implement this in your app: \n\n ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);\n MutableList\u003cApplicationExitInfo\u003e exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);\n for (ApplicationExitInfo aei: exitReasons) {\n if (aei.getReason() == REASON_CRASH_NATIVE) {\n // Get the tombstone input stream.\n InputStream trace = aei.getTraceInputStream();\n // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.\n Tombstone tombstone = Tombstone.parseFrom(trace);\n }\n }\n\nDebug native memory issues\n--------------------------\n\n### Address Sanitizer (HWASan/ASan)\n\n[HWAddress Sanitizer](/ndk/guides/hwasan) (HWASan) and\n[Address Sanitizer](/ndk/guides/asan) (ASan) are similar to Valgrind, but\nsignificantly faster and much better supported on Android.\n\nThese are your best option for debugging memory errors on Android.\n\n### Malloc debug\n\nSee\n[Malloc Debug](https://android.googlesource.com/platform/bionic/+/main/libc/malloc_debug/README.md)\nand\n[Native Memory Tracking using libc Callbacks](https://android.googlesource.com/platform/bionic/+/main/libc/malloc_debug/README_api.md)\nfor a thorough description of the C library's built-in options for debugging\nnative memory issues.\n\n### Malloc hooks\n\nIf you want to build your own tools, Android's libc also supports intercepting\nall allocation/free calls that happen during program execution. See the\n[malloc_hooks documentation](https://android.googlesource.com/platform/bionic/+/main/libc/malloc_hooks/README.md)\nfor usage instructions.\n\n### Malloc statistics\n\nAndroid supports the\n[mallinfo(3)](http://man7.org/linux/man-pages/man3/mallinfo.3.html)\nand\n[malloc_info(3)](http://man7.org/linux/man-pages/man3/malloc_info.3.html)\nextensions to `\u003cmalloc.h\u003e`.\n\nThe `malloc_info` functionality is available in Android 6.0 (Marshmallow) and\nhigher and its XML schema is documented in Bionic's\n[malloc.h](https://android.googlesource.com/platform/bionic/+/main/libc/include/malloc.h)\nheader.\n\nProfiling\n---------\n\nFor CPU profiling of native code, you can use [Simpleperf](/ndk/guides/simpleperf)."]]