애플 생태계에서 개발하다 보면, 디버깅과 성능 최적화는 필수적인 과정입니다. 특히 앱이 충돌할 때, 충돌 로그를 분석하여 문제의 근본 원인을 찾아내는 것이 매우 중요합니다. 이때 atos
라는 강력한 도구가 큰 도움이 됩니다. atos
는 “Address To Symbol”의 약자로, 메모리 주소를 코드의 구체적인 심볼로 변환해 줍니다. 이 블로그 글에서는 atos
도구의 기능과 사용 방법에 대해 자세히 알아보겠습니다.
1. atos
란 무엇인가?
atos
는 macOS에 포함된 명령줄 도구로, Xcode Command Line Tools에 설치됩니다. 이 도구는 충돌 로그에 나타난 메모리 주소를 심볼로 변환하여 개발자가 소스 코드의 어느 부분에서 문제가 발생했는지 쉽게 파악할 수 있도록 도와줍니다.
2. atos
설치 및 확인
atos
도구는 Xcode Command Line Tools를 통해 설치됩니다. 만약 설치되지 않았다면, 터미널에서 다음 명령을 실행하여 설치할 수 있습니다:
xcode-select --install
설치가 완료되면, which
명령을 사용하여 atos
도구의 위치를 확인할 수 있습니다:
which atos
대부분의 경우, atos
는 /usr/bin/atos
에 위치하고 있습니다.
3. atos
사용 준비: dSYM 파일과 바이너리
atos
를 사용하려면, dSYM 파일과 바이너리 파일이 필요합니다. dSYM 파일은 디버그 심볼 파일로, 빌드 시 자동으로 생성됩니다. Xcode의 DerivedData 디렉토리나 빌드 아카이브에서 dSYM 파일을 찾을 수 있습니다.
dSYM 파일 찾기
- Xcode에서
Window
->Organizer
를 엽니다. Archives
탭에서 충돌이 발생한 빌드 아카이브를 선택합니다.Show in Finder
를 클릭하여 해당 아카이브 폴더를 엽니다..xcarchive
파일을 마우스 오른쪽 버튼으로 클릭하고Show Package Contents
를 선택합니다.dSYMs
폴더에서 dSYM 파일을 찾습니다.
바이너리 파일 찾기
앱 바이너리 파일은 .app
디렉토리 내에 있습니다. 보통 경로는 다음과 같습니다:
/path/to/YourApp.app/YourApp
4. atos
사용 예제
충돌 로그에서 필요한 정보를 추출한 후, atos
를 사용하여 심볼리케이트할 수 있습니다. 예를 들어, 충돌 로그에서 다음과 같은 정보를 얻었다고 가정합니다:
- 바이너리 이미지 경로:
/path/to/YourApp.app/YourApp
- 로드 주소:
0x100000000
- 충돌 주소:
0x10007a6bc
터미널에서 다음 명령을 실행합니다:
atos -arch arm64 -o /path/to/YourApp.app/YourApp -l 0x100000000 0x10007a6bc
이 명령은 충돌 주소 0x10007a6bc
를 심볼리케이트하여, 소스 코드의 구체적인 파일과 라인 번호를 보여줍니다.
5. atos
옵션 설명
atos
명령에는 다양한 옵션이 있습니다. 주요 옵션들을 살펴보겠습니다:
-arch <architecture>
: 심볼리케이션을 수행할 아키텍처를 지정합니다. 예를 들어,arm64
,x86_64
등. iOS 앱의 경우 일반적으로arm64
를 사용합니다.atos -arch arm64 -o /path/to/YourApp.app/YourApp -l 0x100000000 0x10007a6bc
-o <binary-image>
: 분석할 바이너리 이미지의 경로를 지정합니다.atos -o /path/to/YourApp.app/YourApp -l 0x100000000 0x10007a6bc
-l <load-address>
: 바이너리가 메모리에 로드된 시작 주소를 지정합니다.atos -l 0x100000000 -o /path/to/YourApp.app/YourApp 0x10007a6bc
address...
: 심볼리케이션할 메모리 주소를 지정합니다. 여러 주소를 공백으로 구분하여 지정할 수 있습니다.atos -o /path/to/YourApp.app/YourApp -l 0x100000000 0x10007a6bc 0x10007b150
-printHeader
: 바이너리 이미지의 Mach-O 헤더를 출력합니다.-printLine
: 심볼리케이션된 주소와 함께 소스 코드의 파일과 라인 번호를 출력합니다.-fullPath
: 심볼리케이션된 결과에 전체 파일 경로를 포함합니다.
예를 들어, 소스 코드의 파일과 라인 번호를 포함하여 심볼리케이션 결과를 출력하려면:
atos -arch arm64 -o /path/to/YourApp.app/YourApp -l 0x100000000 -printLine 0x10007a6bc
6. 추가 고려사항
- 정확한 로드 주소 사용: 충돌 로그에서 올바른 로드 주소를 사용하는 것이 중요합니다. 잘못된 로드 주소를 사용하면 심볼리케이션 결과가 정확하지 않을 수 있습니다.
- dSYM 파일 관리: 빌드된 각 버전의 dSYM 파일을 보관하는 것이 좋습니다. 앱 스토어에 배포된 후에도 해당 버전의 dSYM 파일이 필요할 수 있습니다.
- 자동화: CI/CD 파이프라인에
atos
명령을 통합하여 자동으로 충돌 로그를 분석할 수 있습니다.
7. 결론
atos
는 macOS 및 iOS 개발자에게 매우 유용한 도구입니다. 충돌 로그의 메모리 주소를 심볼리케이션하여, 문제의 원인을 신속하게 파악하고 해결하는 데 큰 도움이 됩니다. 이 글에서 설명한 내용을 바탕으로, atos
를 활용하여 보다 효율적인 디버깅과 문제 해결을 경험하시길 바랍니다. 추가적인 질문이나 도움이 필요하면 언제든지 문의해 주세요.