문제해결

[오류 해결] 역대급 끈기를 요구했던 12시간 디버깅 후기 / 유니티 iOS xCode 빌드 시 libc++abi: terminating due to uncaught exception of type nsexception / terminating due to uncaught exception of type nsexception

samosa 2024. 9. 9. 12:13

물론 12시간이 나의 최장 디버깅 시간은 아니다. 그러나...

이번 디버깅은 역대급 끈기를 요구했는데, 그 이유는 무엇이 문제인지 전혀 감이 오지 않았기 때문.

결론적으로 모든 커밋을 하나하나 따라가보며 언제 빌드가 망가졌는지 보기로 했다.

 

문제가 된 커밋은 바로 변경사항이 2700개 정도 되었던, 안드로이드 개발 환경에서 커밋했던 내역이다. 왜이렇게 많은 변경사항을 한꺼번에 커밋하였나? 하.. 원래는 그러지 않으려고 하는데, 이번 업데이트 때 파이어베이스 연동과 언어 현지화를 구현하면서 여러 외부 SDK, UI와 씬 작업 내용까지 섞여서 거대 커밋이 되어버렸다. (안드로이드에서 나눠서 커밋할걸. 그러나 나는 너무 피곤했었다.ㅎ)

이걸 iOS에서 열어서 빌드를 하니 문제가 생긴 것이다.


디버깅 과정

0. Cocoapods

xcworkspace 파일이 생성되지 않아서 pod 싹 제거 후 homebrew로 재설치했다. ruby version 같은 건 이전에 해놓아서 큰 문제는 없었다. 이전 포스팅: https://gamemakers.tistory.com/28

 

1. GoogleMobileAds 의존성 문제로 xCode 빌드가 실패

이때의 podfile 상태: 

source 'https://cdn.cocoapods.org/'
source 'https://github.com/CocoaPods/Specs'

platform :ios, '13.0'

target 'UnityFramework' do
  pod 'Firebase/Auth', '>= 0'
  pod 'Firebase/Core', '11.0.0'
  pod 'Firebase/Storage', '10.20.0'
  pod 'Google-Mobile-Ads-SDK', '~> 10.14'
end
target 'Unity-iPhone' do
end
use_frameworks! :linkage => :static

 

platform ios 13은 원래 12였는데, Firebase의 최소 요건을 충족하면서 13으로 올렸다.

Google-Mobile-Ads-SDK가 아직 버전 오류가 남아있어 검색을 열심히 해보니 간단하게 해결이 되었다.

최신 패키지에서 해결이 된 듯하니 이걸 받아서 업데이트 해준다. https://github.com/googleads/googleads-mobile-unity

 

2. 빌드는 성공했으나 앱 크래시 시작!

오류 메시지로 이런 것이 계속 떴다~

  • libc++abi: terminating due to uncaught exception of type nsexception
  • terminating due to uncaught exception of type nsexception

구글링을 해봐도 내 환경에서 참고할만한 게 나오지 않았다. 흔한 오류가 아닐 것 같을 뿐더러 주로 Swift 앱에서 발생하는 것 같기도.

 

그래서 나는 바로 해결책을 찾기보다 원인을 찾기로 했다! ^ㅡ^

변경사항을 적당한 단위로 쪼개서, 각각이 반영된 빌드를 해서 기기에서 실행해보고 크래시가 일어나는지 확인하기로.

 

외부 패키지에서 오류가 났는가?

문제의 커밋에서 변경사항이 2700개정도 있었으므로, 일단 외부 패키지들을 각각 잘라서 보았다. 이 과정이 이미 몇 시간이 걸렸는데, 놀랍게도 외부 패키지의 문제가 아니었다.

 

아트 애셋은 아니겠거니 하며 넘겼다. 실제로 아니었다.

 

그렇다면 내 스크립트 중 하나라는 것인데. 깃 lfs 같은 것 때문에 뭔가 꼬였나? 어쨌든 디버깅한 결과 파이어베이스 관련 로직이 좀 들어있던 스크립트가 문제였다. 이 특정 스크립트를 찾아내는데 거의 6시간이 걸린 것 같다. ㅎㅎ

 

Firebase 연동 테스트하는 코드가 문제였다. 이런 부분들을 쭉 주석처리해주니 앱 크래시가 일어나지 않았다. 

 

왜일까? 모르겠다. 일단 디버깅이 끝나서 너무 즐겁다!! 급 마무리.