LLVM 2.0으로 Xcode 4.0.1에서 응용 프로그램을 빌드하려고 할 때 레벨 또는 최적화가 아닌 (-O0 이외의) 최적화가 완료되면 응용 프로그램이 충돌합니다. 내가 장치에서 실행 (시뮬레이터는 괜찮아). xcode를 빌드하고 GDB/LLDB를 통해 연결할 때 충돌이 디버깅되지 않는 것 같습니다. 또한, xcodebuild를 사용하여 명령 줄에 응용 프로그램을 빌드 할 때만 충돌이 발생합니다. XCode IDE를 통한 빌드는 정확히 동일한 프로젝트 설정으로도 충돌하지 않습니다. .LLVM 및 임의 최적화를 사용하여 빌드하면 시작시 응용 프로그램이 충돌합니다.
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00b53400
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 ??? 0x00b53400 0 + 11875328
는 충돌에서 발생하는 라이브러리를 알 수 없기 때문에 제대로 symbolicate하지 않습니다
: 충돌이 내 코드 이외의 발생으로 나는 충돌 로그에 유용한 정보를 볼 수 없습니다
디바이스 콘솔은 우리 앱이 시작할 때 만들어지는 NSLog 문을 보여 주며, 첫 번째 화면의 UI가로드되고 그려지고 그 후에 충돌이 발생합니다. 최적화없이 구축하거나, GCC 4.2로 최적화 된 최적화 레벨로 구축하는 것이 좋습니다.
여기서 어떤 일이 벌어 질 수 있으며 어떻게 디버깅 할 수 있습니까? xcodebuild가 xcodebuild 명령 줄 인터페이스와 비교하여 응용 프로그램을 빌드하고 배포 할 때 XCode IDE가 다르게 수행 할 수있는 작업은 무엇입니까?
조금 더 많은 색상. Xcode 3.2.x-4.0.1이 설치된 LLVM 1.6-2.0은이 충돌을 일으키는 코드를 생성 할 수 있습니다. 또한 최적화 수준이 아무런 영향을 미치지 않는 것으로 보입니다. -O0 이상의 결과가 발생합니다. –
다른 대안은 조건부로 -O0을 ARMv6 용으로 빌드하고 ARMv7에서는 -Os 또는 사용하는 모든 것을 그대로 둡니다. Xcode 4.x에서이를 수행하려면 타겟의 빌드 설정에서 "최적화 레벨"옆의 플러스를 클릭 한 다음 특별한 경우 인 ARMv6을 클릭하십시오. Xcode가 자동으로 변경 사항을 적용하지 않는 것으로 보아 이후에 정리하고 다시 컴파일해야합니다. –
+ BenLachman은 아키텍처 별 조건부 최적화에 대한 환상적인 팁이지만, 그렇게 할 수 있는지 전혀 몰랐습니다. 앞으로는 -O0을 사용하여 ARMv6 코드를 모두 빌드 할 수 있습니다. iPhone 3G 장비를 사용하는 고객의 비율은 적으며 성능 손실은 안정성의 향상으로 인해 크게 상회합니다. –