이 페이지에서는 Crashlytics 사용과 관련된 자주 묻는 질문(FAQ)에 대한 답변과 문제 해결 도움말을 제공합니다. 원하는 내용을 찾을 수 없거나 추가 지원이 필요하면 Firebase 지원팀에 문의하세요.
일반적인 문제 해결 및 FAQ
문제 표에 일부 문제에 대해 다른 형식(가끔 '변형')이 표시됨
Firebase Console의 문제 표에 두 가지 다른 문제 형식이 표시될 수 있습니다. 또한 일부 문제에는 '변형'이라는 특징이 있을 수 있습니다. 이유는 다음과 같습니다.
2023년 초, Google에서는 이벤트 그룹화를 위한 향상된 분석 엔진, 업데이트된 디자인, 새로운 문제(예: 변형)에 대한 일부 고급 기능을 출시했습니다. 자세한 내용은 최근 블로그 게시물을 참조하세요. 아래에서 주요 내용을 확인할 수 있습니다.
Crashlytics는 앱의 모든 이벤트(예: 비정상 종료, 심각하지 않은 문제, ANR)를 분석하고 문제라는 이벤트 그룹을 만듭니다. 한 문제의 모든 이벤트에는 공통적인 장애점이 있습니다.
이벤트를 이러한 문제로 그룹화하기 위해 이제 향상된 분석 엔진이 스택 트레이스의 프레임, 예외 메시지, 오류 코드, 기타 플랫폼 또는 오류 유형 특성 등 이벤트의 여러 측면을 살펴봅니다.
그러나 이 이벤트 그룹 내에서 장애로 이어지는 스택 트레이스가 다를 수 있습니다. 스택 트레이스가 다르면 근본 원인이 달라질 수 있습니다.
문제 내에서 발생할 수 있는 이러한 차이를 나타내기 위해 이제 문제 내에 변형을 만듭니다. 각 변형은 문제에서 동일한 장애점 및 유사한 스택 트레이스가 있는 이벤트의 하위 그룹입니다. 변형을 사용하면 문제 내에서 가장 일반적인 스택 트레이스를 디버깅하고 서로 다른 근본 원인으로 인해 장애가 발생했는지 파악할 수 있습니다.
개선된 기능은 다음과 같습니다.
문제 행에 개선된 메타데이터 표시 이제 앱의 문제를 더 쉽게 파악하고 분류할 수 있습니다.
중복 문제 감소 줄 번호를 변경해도 새 문제가 발생하지 않습니다.
다양한 근본 원인이 있는 복잡한 문제를 더 손쉽게 디버깅 변형을 사용하여 문제 내에서 가장 일반적인 스택 트레이스를 디버깅합니다.
더 의미 있는 알림과 신호 새로운 문제가 실제로는 새로운 버그를 나타냅니다.
더욱 강력한 검색 각 문제에 예외 유형 및 패키지 이름과 같이 검색 가능성이 더 높은 메타데이터가 포함됩니다.
개선된 기능이 적용되는 방식은 다음과 같습니다.
앱에서 새로운 이벤트가 수신되면 기존 문제와 일치하는지 확인합니다.
일치하는 항목이 없으면 이벤트에 더 스마트한 이벤트 그룹화 알고리즘을 자동으로 적용하고 개선된 메타데이터 설계로 새로운 문제를 만듭니다.
Google에서 진행 중인 이벤트 그룹화에 대한 첫 번째 대규모 업데이트입니다. 의견이 있거나 문제가 발생하면 신고를 제출하여 알려주시기 바랍니다.
비정상 종료가 발생하지 않은 측정항목 또는 신속 알림이 표시되지 않음
비정상 종료가 발생하지 않은 측정항목(예: 비정상 종료가 발생하지 않은 사용자 및 세션)이나 신속 알림이 표시되지 않으면 다음을 사용 중인지 확인하세요.
Crashlytics SDK v18.6.0 이상(또는 Firebase BoM v32.6.0 이상)
탐색경로 로그가 표시되지 않음
탐색경로 로그가 표시되지 않는 경우 Google Analytics의 앱 구성을 확인하는 것이 좋습니다.
다음 요건을 충족해야 합니다.
특히 적어도Google Analytics용 Firebase SDK의 다음 버전을 사용하는지 확인하세요. Android - v17.2.3 이상(BoM v24.7.1 이상)
Android 11 이상에서만 ANR이 보고되는 이유는 무엇인가요?
Crashlytics는 Android 11 이상을 실행하는 기기에서 Android 앱의 ANR 보고를 지원합니다. ANR을 수집하는 데 사용되는 기본 API(getHistoricalProcessExitReasons)는 SIGQUIT 또는 watchdog 기반 접근 방식보다 더 안정적입니다. 이 API는 Android 11 이상 기기에서만 사용할 수 있습니다.
일부 ANR에서 BuildId가 누락된 이유는 무엇인가요?
일부 ANR에서 BuildId가 누락된 경우 다음과 같이 문제를 해결합니다.
최신 Crashlytics Android SDK 및 Crashlytics Gradle 플러그인 버전을 사용 중인지 확인합니다.
Android 11 및 일부 Android 12 ANR에서 BuildId가 누락되면 오래된 SDK, Gradle 플러그인 또는 둘 다를 사용하고 있을 수 있습니다.
이러한 ANR의 BuildId를 올바르게 수집하려면 다음 버전을 사용해야 합니다.
앱의 공유 라이브러리에 BuildId만 누락되었다면 공유 라이브러리의 표준 기본 위치를 사용하지 않았을 가능성이 높습니다. 이 경우 Crashlytics가 연결된 BuildId를 찾지 못할 수 있습니다. 공유 라이브러리에는 표준 위치를 사용하는 것이 좋습니다.
빌드 프로세스 중에 BuildId를 제거하지 않도록 합니다.
다음 문제 해결 팁은 ANR 및 네이티브 충돌 모두에 적용됩니다.
바이너리에서 readelf -n을 실행하여 BuildId가 있는지 확인합니다. BuildId가 없으면 빌드 시스템의 플래그에 -Wl,--build-id를 추가합니다.
APK 크기를 줄이기 위해 의도치 않게 BuildId를 제거하지 않았는지 확인합니다.
라이브러리의 제거된 버전과 제거되지 않은 버전을 유지하는 경우 코드에서 올바른 버전을 가리켜야 합니다.
Crashlytics 대시보드의 ANR 보고서와 Google Play Console의 ANR 보고서의 차이점
Google Play와 Crashlytics 간에는 ANR 수가 일치하지 않을 수 있습니다. 이것은 ANR 데이터를 수집하고 보고하는 메커니즘에 차이가 있기 때문입니다. Crashlytics는 다음번 앱이 시작될 때 ANR을 보고하는 반면 Android vitals는 ANR이 발생한 후에 ANR 데이터를 보냅니다.
또한 Crashlytics는 Google Play 서비스 및 데이터 수집 동의가 허용된 기기의 ANR을 표시하는 Google Play와 달리 Android 11 이상을 실행하는 기기에서 발생하는 ANR만 표시합니다.
Crashlytics 대시보드와 logcat 간의 NDK 스택 트레이스 차이점
LLVM 및 GNU 도구 모음에는 앱 바이너리의 읽기 전용 세그먼트에 대한 고유 기본값과 처리 방식이 있으므로 Firebase Console에서 일관되지 않은 스택 트레이스를 생성할 수 있습니다. 이 문제를 완화하려면 빌드 프로세스에 다음 링커 플래그를 추가하세요.
LLVM 도구 모음의 lld 링커를 사용하는 경우 다음을 추가합니다.
-Wl,--no-rosegment
GNU 도구 모음의 ld.gold 링커를 사용하는 경우 다음을 추가합니다.
-Wl,--rosegment
스택 트레이스 불일치가 계속 발생하거나 도구 모음과 관련된 플래그가 없는 경우 대신 빌드 프로세스에 다음을 추가해 보세요.
-fno-omit-frame-pointer
NDK에 자체 Breakpad 기호 파일 생성기 바이너리를 사용하려면 어떻게 해야 하나요?
Crashlytics 플러그인은 맞춤설정된 Breakpad 기호 파일 생성기를 번들로 제공합니다.
Breakpad 기호 파일을 생성하는 데 자체 바이너리를 사용하려면(예: 소스에서 빌드 체인에 모든 네이티브 실행 파일을 빌드하려는 경우) 선택사항인 symbolGeneratorBinary 확장 프로그램 속성을 사용하여 해당 실행 파일의 경로를 지정하세요.
다음 두 가지 방법 중 하나를 사용하여 Breakpad 기호 파일 생성기 바이너리에 대한 경로를 지정할 수 있습니다.
옵션 1: build.gradle 파일의 firebaseCrashlytics 확장 프로그램을 통해 경로 지정
앱 수준 build.gradle.kts 파일에 다음을 추가합니다.
Gradle 플러그인 v3.0.0 이상
android {
buildTypes {
release {
configure<CrashlyticsExtension> {
nativeSymbolUploadEnabled = true
// Add these optional fields to specify the path to the executable
symbolGeneratorType = "breakpad"
breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS")
}
}
}
}
낮은 플러그인 버전
android {
// ...
buildTypes {
// ...
release {
// ...
firebaseCrashlytics {
// existing; required for either symbol file generator
nativeSymbolUploadEnabled true
// Add this optional new block to specify the path to the executable
symbolGenerator {
breakpad {
binary file("/PATH/TO/BREAKPAD/DUMP_SYMS")
}
}
}
}
}
옵션 2: Gradle 속성 파일의 속성 줄을 통해 경로 지정
com.google.firebase.crashlytics.breakpadBinary 속성을 사용하여 실행 파일의 경로를 지정할 수 있습니다.
Gradle 속성 파일을 수동으로 업데이트하거나 명령줄을 통해 파일을 업데이트할 수 있습니다. 예를 들어 명령줄을 통해 경로를 지정하려면 다음과 같은 명령어를 사용합니다.
.java 문제로 라벨이 지정된 .kt 파일에서 비정상 종료가 표시되는 이유는 무엇인가요?
앱에서 파일 확장자를 노출하지 않는 난독 처리기를 사용하는 경우 Crashlytics는 기본적으로 .java 파일 확장자로 각 문제를 생성합니다.
Crashlytics에서 올바른 파일 확장자로 문제를 생성할 수 있도록 앱에서 다음 설정을 사용하는지 확인하세요.
Android Gradle 4.2.0 이상 사용
난독화가 사용 설정된 상태로 R8 사용. 앱을 R8로 업데이트하려면 이 문서의 안내를 따르세요.
위에 설명된 설정으로 업데이트하면 기존 .java 문제와 중복되는 새로운 .kt 문제가 표시되기 시작할 수 있습니다. 이러한 상황에 대한 자세한 내용은 FAQ를 참고하세요.
기존 .java 문제와 중복된 .kt 문제가 표시되는 이유는 무엇인가요?
2021년 12월 중순부터, Crashlytics에서 Kotlin을 사용하는 애플리케이션 관련 지원을 개선했습니다.
최근까지는 사용 가능한 난독화 도구가 파일 확장자를 노출하지 않았으므로 Crashlytics는 기본적으로 .java 파일 확장자로 각 문제를 생성했습니다.
하지만 Android Gradle 4.2.0부터 R8에서 파일 확장자를 지원합니다.
이 업데이트를 통해 이제 Crashlytics는 앱 내에서 사용되는 각 클래스가 Kotlin으로 작성되었는지 확인하고 문제 서명에 올바른 파일 이름을 포함할 수 있습니다. 이제 앱에서 다음 설정을 사용하는 경우 비정상 종료가 .kt 파일에 올바르게 인식됩니다.
앱에서 Android Gradle 4.2.0 이상 사용
앱에서 난독화가 사용 설정된 상태로 R8 사용
이제 새로운 비정상 종료의 문제 서명에 올바른 파일 확장자가 포함되므로 기존의 .java 라벨로 된 문제와 실제로 중복되는 새로운 .kt 문제가 표시될 수 있습니다. Firebase Console에서는 새로운 .kt 문제가 기존의 .java 라벨로 된 문제와 중복되었을 가능성이 있는지 확인하고 안내합니다.
문제에 관한 메모를 보고, 작성하고, 삭제할 수 있는 권한은 누구에게 있나요?
프로젝트 구성원은 메모를 통해 질문, 상태 업데이트 등의 특정 문제에 대한 의견을 남길 수 있습니다.
프로젝트 구성원이 메모를 게시하면 Google 계정의 이메일로 라벨이 지정됩니다. 이 이메일 주소는 메모를 확인할 권한이 있는 모든 프로젝트 구성원에게 메모와 함께 표시됩니다.
다음은 메모를 보고 작성하고 삭제하는 데 필요한 액세스 권한입니다.
다음 역할의 프로젝트 구성원은 기존 메모를 보고 삭제할 수 있으며, 문제에 관한 새로운 메모를 작성할 수 있습니다.
또한 앱이 Google Mobile Ads SDK를 사용하지만 비정상 종료가 발생하지 않습니다.
프로젝트에서 Google Mobile Ads SDK와 함께 Crashlytics를 사용하는 경우 예외 핸들러를 등록할 때 비정상 종료 보고 도구가 간섭할 가능성이 있습니다. 이 문제를 해결하려면 disableSDKCrashReporting을 호출하여 Mobile Ads SDK에서 비정상 종료 보고를 사용 중지하세요.
내 BigQuery 데이터 세트는 어디에 있나요?
Crashlytics를 BigQuery에 연결하면 Firebase 프로젝트의 위치에 관계없이, 생성한 새 데이터 세트가 자동으로 미국에 위치합니다.
플랫폼 지원
Crashlytics는 armeabi를 지원하나요?
Firebase Crashlytics NDK는 ARMv5(armeabi)를 지원하지 않습니다.
이 ABI에 대한 지원은 NDK r17부터 삭제되었습니다.
회귀된 문제
회귀된 문제란 무엇인가요?
이전에 문제를 종료했지만 Crashlytics에서 해당 문제가 다시 발생했다는 새로운 보고를 받으면 문제가 회귀된 것입니다.
앱에 맞게 문제를 해결할 수 있도록 Crashlytics에서 이러한 회귀된 문제를 자동으로 다시 엽니다.
다음은 Crashlytics에서 문제를 회귀로 분류하는 방식을 설명하는 예시 시나리오입니다.
Crashlytics에서 처음으로 비정상 종료 'A'에 관한 비정상 종료 보고서를 받습니다. Crashlytics에서 이 비정상 종료에 해당하는 문제(문제 'A')를 엽니다.
개발자가 이 버그를 신속하게 수정하고 문제 'A'를 종료한 후 앱의 새 버전을 출시합니다.
개발자가 문제를 종료한 후 Crashlytics에서 문제 'A'에 관한 다른 보고서를 받습니다.
문제가 종료되었을 때 Crashlytics에서 알고 있는 앱 버전에서 보고서를 보낸 경우(즉, 해당 버전에서 모든 비정상 종료에 대해 비정상 종료 보고서를 보낸 경우) Crashlytics에서는 문제가 회귀된 것으로 간주하지 않습니다. 문제가 종료된 상태로 유지됩니다.
문제가 종료되었을 때 Crashlytics에서 모르는앱 버전에서 보고서를 보낸 경우(즉, 해당 버전에서 비정상 종료에 대해 어떠한 비정상 종료 보고서도 보내지 않은 경우) Crashlytics에서 문제가 회귀된 것으로 간주하고 문제를 다시 엽니다.
문제가 회귀되면 Crashlytics에서 문제를 다시 열었음을 알 수 있도록 회귀 감지 알림이 전송되고 문제에 회귀 신호가 추가됩니다. 회귀 알고리즘으로 인해 문제가 다시 열리지 않도록 하려면 문제를 종료하는 대신 '숨기세요'.
이전 앱 버전의 회귀된 문제가 표시되는 이유는 무엇인가요?
문제가 종료되었을 때 비정상 종료 보고서를 보낸 적이 없는 이전 앱 버전에서 보고서를 보내면 Crashlytics에서 문제가 회귀된 것으로 간주하고 문제를 다시 엽니다.
이러한 상황은 다음과 같은 경우에 발생할 수 있습니다. 개발자가 버그를 수정하고 앱의 새 버전을 출시했지만 버그가 수정되지 않은 이전 버전에 아직 사용자가 있습니다. 만약 문제가 종료되었을 때 이전 버전 중 하나에서 비정상 종료 보고서를 보낸 적이 없는 경우 해당 사용자에게 버그가 발생하기 시작하면 비정상 종료 보고서가 회귀된 문제를 트리거합니다.
회귀 알고리즘으로 인해 문제가 다시 열리지 않도록 하려면 문제를 종료하는 대신 '숨기세요'.