ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dSYM (feat. Firebase Crashlytics)
    iOS 2022. 8. 29. 16:11

    안녕하세요. 그린입니다🍏

    이번 포스팅에서는 dSYM에 대해 알아보고 Firbase Crashlytics에서 해당 앱의 비정상 종료되는 상황의 에러 리포트를 받을 수 있도록 dSYM 파일을 업로드 하는 방법에 대해 학습해보겠습니다🙌

     

    dSYM?

    dSYM이란 debug symbol file의 약자입니다.

    dSYM 파일은 이름에서도 알 수 있듯이 해당 앱의 디버그 기호 및 정보를 저장합니다.

    앱들은 간혹 런타임 에러가 날 경우가 있습니다.

    즉 강제 종료가 되는것이고 이는 사용자에게 좋지 않은 사용 경험을 주는것이죠.

    그렇기에 꼭 어떤 상황 및 빌드에서 어떤 에러가 나타나는지 배포되어 운영되는 앱에서는 꼭 이를 분석하여 개선시켜야 합니다.

    이런 분석을 하기 위해서는 예를들어 파이어베이스의 crashlytics 같은 에러 리포트 및 분석 툴을 이용해 파악할 수 있습니다.

    이런 툴을 사용해 분석을 하기 위해서는 해당 앱의 정보가 있어야 됩니다.

    여기서 해당 앱의 정보가 dSYM입니다.

    dSYM이 즉 빌드 시점에서 컴파일러가 우리가 작성한 코드(high-level)를 기계어(low-level)로 변환해주게 되고 이 때 dSYM이 생성됩니다.

    여기서 우리는 기계어로 된 코드를 보기 힘들고 사실 이걸로 분석 할 수 있는 사람은 극히 드물거에요.

    그렇기에 dSYM은 생성될때 이 기계어(low-level)을 코드(high-level)로 변환 정보를 가지고 있습니다.

    즉 결국 서두에서 말했듯 다시 한번 정리하자면 dSYM은 앱의 디버그 기호가 저장되어 있습니다.

     

    그럼 이 dSYM을 어떻게 사용하고 활용하는지 더 나아가서 알아보시죠!

     

    dSYM과 Apple Store Connect

    매번 리팩토링 및 기능 추가를 하고 앱의 버전이 달라지고 배포하게 됩니다.

    그럼 어떤 버전에서 어떤 에러가 났는지 리포트를 받는것이 중요하다고 위에서 언급했어요😃

    그렇기에 새 버전마다 달라지는 UUID를 가지고 테스트 플라이트에 해당 빌드 버전의 앱을 업로드 할때 이 dSYM가 같이 올라가도록 생성하고 설정할 수 있습니다.

    그러면 이 dSYM을 Apple Store Connect에서 다시 다운 받아 사용할 수 도 있습니다.

    Apple Store Connect의 TestFlight에서 업로드 된 빌드에서 이 dSYM을 아래와 같이 찾아 들어가서 다운 받아볼 수 있어요.

    우선 위와 같이 업로드 되었으면 해당 빌드 버전을 클릭해 정보를 봅니다.

    그럼 여기서 빌드 메타 데이터 탭에서 기호 포함 요 부분이 dSYM 정보를 가지고 있는 항목입니다.

    즉 저기서 dSYM 다운로드를 하면 해당 앱의 dSYM 파일 폴더가 아래와 같이 다운로드 됩니다.

    자 저렇게 3개의 dSYM 파일이 만들어졌죠?

    그럼 다들 구성은 거의 동일할테니 하나가 어떤 info 형식을 가지고 있는지 보겠습니다.

    파일을 열어보죠🙋🏻

    위와 같이 구성되있고 Info.plist를 보면 해당 dSYM의 정보가 아래 코드처럼 들어가있어요.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    	<dict>
    		<key>CFBundleDevelopmentRegion</key>
    		<string>English</string>
    		<key>CFBundleIdentifier</key>
    		<string>com.apple.xcode.dsym.NMapsMap</string>
    		<key>CFBundleInfoDictionaryVersion</key>
    		<string>6.0</string>
    		<key>CFBundlePackageType</key>
    		<string>dSYM</string>
    		<key>CFBundleSignature</key>
    		<string>????</string>
    		<key>CFBundleShortVersionString</key>
    		<string>1.0</string>
    		<key>CFBundleVersion</key>
    		<string>1</string>
    	</dict>
    </plist>

    com.apple.xcode.dsym.xxxx 처럼 Bundle Identifier가 생성되는걸 확인할 수 있습니다.

     

    dSYM 생성

    자 그럼 어떻게 생성하고 설정하는지 먼저 보시죠!

    dSYM을 생성하기 위해서는 생성하고 싶은 각 타겟에서 아래 경로로 접근해줍니다.

    Target > Build Settings > Build Options > Debug Information Format

    여기서 설정을 DWARF with dSYM File로 해줍니다.

    여기서 알아 둬야 할것은 만약 모듈화가 되어 있어 타겟이 여러개라면 각 설정마다 생성될지 안될지가 다릅니다.

    위처럼 설정을 한다고 가정해볼께요.

    타겟의 Build Settings > Linking > Mach-O Type 옵션을 보면 Dynamic인지 Static인지 확인할 수 있고 이 타입에 따라 dSYM이 생성될지가 결정되요.

    Dynamic일 경우 dSYM이 각각 생성됩니다.

    반대로 Static일 경우는 해당 빌드 시점에 프로젝트에 linking이 되기에 dSYM이 생성되지 않습니다.

    생성되지 않는것은 해당 프로젝트 앱 바이너리에 같이 존재하는것이죠.

    이 차이는 Dynamic과 Static의 차이를 이해하면 쉽습니다.

    이에 대해 아래 포스팅에서 정리해뒀으니 조금 더 깊은 이해를 하고 싶다면 보시길 권장드려요 🙌

    https://green1229.tistory.com/208

     

    Static Framework & Dynamic Framework (feat. Library)

    안녕하세요. 그린입니다🟢 이번 포스팅에서는 Framework에 대해서 static과 dynamic으로 나눠 학습해보겠습니다💁🏻 우선 Framework에 대해 짚어보고 갈께요. Framework? 프레임워크라 함은 frame + work의

    green1229.tistory.com

     

    Firebase Crashlytics?

    해당 dSYM을 이용하여 앱 에러 리포트 분석을 파이어베이스를 사용해보겠습니다.

    먼저 Firebase Crashlytics가 어떤건지 간단히 본 다음에 설정하는법에 대해 자세히 스텝별로 진행해볼께요!

    우선 Firebase Crashlytics는 dSYM 파일을 자동 처리해서 사람이 읽을 수 있는 조금 가독화가 잘 된 high-level 언어로 에러 리포트를 제공해줍니다.

    아래와 같은 리포트 화면입니다.

    이렇게 메인 분석 화면에서는 통계를 보여줍니다.

    그 아래에는 이런식으로 어떤 에러들이 발생했는지 리스트업 해줍니다.

    그럼 이 리스트중 하나를 한번 자세히 보시죠!

    이렇게 스택 추적 / 키 / 로그 / 데이터를 탭 별로 확인할 수 있습니다.

    주로 로그와 데이터를 파악하면서 크래쉬 분석을 하는데요.

    여기서 로그는 이 에러가 발생하기까지 어떤 과정을 거쳤는지 스텝을 보여줍니다.

    데이터는 어떤 OS를 사용하는지 디바이스는 어떤건지 언제 발생했는지 크래쉬가 발생한 앱 버전은 어떤건지 등을 파악할 수 있죠.

    아주 유용하고 쉽게 크래쉬 분석을 할 수 있습니다🙌

     

    그럼 이어서 Firebase Crashlytics를 어떻게 설정하는지 바로 고 🏃🏻

     

    Firebase Crashlytics 설정하기

    CI/CD를 구성하며 다양하게 자동화로 녹여낼 수 있는 여러가지 방법이 있겠지만 이 포스팅에서는 가장 기본적인 방법들로 학습해볼께요!

    우선 직접 Firebase 대쉬보드에서 dSYM 파일을 업로드 하는 방법, 터미널에서 명령어를 통해 업로드 하는 방법, 앱 내 빌드 스크립트 설정을 통해 자동화 해놓는 방법 이렇게 크게 3가지를 보겠습니다.

     

    Firebase 대쉬보드에서 직접 dSYM 파일 업로드

    위에서 Apple Store Connect에서 dSYM 압축 파일을 다운 받을 수도 있고 아니면 아래와 같이 Xcode에서도 확인할 수 있어요.

    Xcode에서 Window > Organizer를 들어가줍니다.

    그럼 아래와 같은 화면에서 Download Debug Symbols를 클릭해 원하는 빌드 버전의 앱 dSYM을 다운 받으면 됩니다.

    자 그럼 준비된 dSYM 파일을 가지고 Firebase 대쉬보드로 가볼께요!

    Crashlytics 탭에서 dSYM을 보면 업로드를 설정해주지 않았다면 이제 아래와 같이 나타납니다.

    예전에는 없었는데, 이제 친절히 드래그 앤 드롭으로도 간단히 할 수 있게 지원해주네요👍

    그럼 아까 dSYM 압축 파일을 업로드 해버리면 끝~~!!

     

    터미널에서 명령어를 통해 dSYM 업로드를 하는 방법

    아카이빙으로 dSYM이 생성되었다면 해당 appDSYM 폴더로 갑니다.

    해당 경로에서 dSYM 업로드를 위해 터미널을 열어 아래 명령어를 입력해줍니다.

    /PATH/TO/PODS/DIRECTORY/FirebaseCrashlytics/upload-symbols -gsp /PATH/TO/GoogleService-Info.plist -p ios /PATH/TO/dSYMs

    아주 쉽게 업로드 가능합니다🙌

     

    앱 내 스크립트 설정을 통해 dSYM 업로드

    Xcode에서 빌드 스크립트 설정을 통해 자동으로 dSYM 업로드를 시켜버릴 수도 있습니다.

    Run Script를 추가해줘 봅시다.

    우선 해당 타겟에서 Build Phases 설정으로 갑니다.

    New Run Script Phase를 통해 새 Run Script를 만듭니다.

    코코아팟일때와 SPM으로 Firebase 라이브러리를 사용할때가 다릅니다.

    CocoaPods일 경우 아래 스크립트를 입력해줍니다.

    "${PODS_ROOT}/FirebaseCrashlytics/run"

    SPM일 경우 아래 스크립트를 입력해줍니다.

    "${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"

    추가로 해당 Run Script에서 Input Files 설정도 해줘야해요!

    ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
    $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)

    위는 dSYM 파일 경로이고 아래는 Info.plist 경로입니다.

     

    마무리

    자 이렇게 dSYM을 알아봤어요!

    어렵지만 알아야할 사항이니까 중요하게 봤습니다ㅎㅎ

     

    [참고자료]

    https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ko&platform=ios 

     

    Crashlytics 대시보드에서 읽을 수 있는 비정상 종료 보고서 받기  |  Firebase Crashlytics

    의견 보내기 Crashlytics 대시보드에서 읽을 수 있는 비정상 종료 보고서 받기 iOS+ Android Flutter Unity 기본적으로 Firebase Crashlytics는 디버그 기호(dSYM) 파일을 자동 처리해 사람이 읽을 수 있는 가독화

    firebase.google.com

Designed by Tistory.