본문 바로가기

TechLog

Xcode 4.0.x에서 하위 프로젝트를 추가했을 때 Xcode가 계속 Crash될 경우

Xcode 4(참고로 현재 케냘이 사용하고 있는 Xcode의 버전은 4.0.2이다)에서 하위 프로젝트를 추가했을 때, Xcode가 다음과 같은 메시지를 보여주며 계속 Crashe되는 경우가 있다 :

ASSERTION FAILURE in /SourceCache/IDEXcode3ProjectSupport/IDEXcode3ProjectSupport-269/Xcode3Sources/XcodeIDE/Frameworks/DevToolsBase/pbxcore/PBXContainerItemProxy.m:268

 

Crash 메시지가 발생해도 Continue 버튼을 계속 클릭하면 어떻게든 진행은 할 수 있지만, 전반적으로 Xcode 자체가 불안정해지기도 하고 Crash 메시지가 계속 발생하니 정신이 사납다. 좋지 않다. 이 문제에 대해 구글링을 해 보면, 위 Crash 메시지는 상당히 다양한 경우에 발생한다고 한다. 케냘의 경우에는 특정 프로젝트(새로 추가한 하위 프로젝트겠지만)가 Xcode 4와 호환되지 않아서 발생하는 케이스였는데, 이 경우 해당 하위 프로젝트를 현재 워크스페이스에서 제거하고 난 다음에도 Crash 메시지가 지속적으로 발생하거나, 컴파일 시 다음과 같은 에러 메시지를 보여줄 때가 있다 :

Missing dependency target "<PBXTargetDependency:0x203c3ba20:<no cached name>>"

 

위 경우, 프로젝트의 설정 파일에 저장된 ‘하위 프로젝트’의 dependency 관련 내용이 하위 프로젝트가 제거되고 난 다음에도 설정 파일에 남아있어서 충돌을 일으키는 것이다. 이렇게 프로젝트의 설정 파일에 남아 있는 내용은 Xcode의 프로젝트 정보 편집기로는 삭제가 불가능하고, 프로젝트 파일을 직접 수정해야 한다. 다음과 같이 작업하면 된다 (우선, 에러가 발생하는 .xcodeproj 파일을 하나 백업해 놓도록 하자) :

.xcodeproj 프로젝트 파일 패키지 내부로 들어가서(.xcodeproj 파일 아이콘을 오른쪽 클릭하고 'Show Package Contents' 메뉴를 클릭하면 된다), project.pbxproj를 연다. 그런 다음 dependency 관련 설정을 직접 수정한다 :


/* Begin PBXNativeTarget section */
        AC1F27E71398C2AC00C42773 /* Mug */ = {
            isa = PBXNativeTarget;
            buildConfigurationList = AC1F28091398C2AC00C42773 /* Build configuration list for PBXNativeTarget "Mug" */;
            buildPhases = (
                AC1F27E41398C2AC00C42773 /* Sources */,
                AC1F27E51398C2AC00C42773 /* Frameworks */,
                AC1F27E61398C2AC00C42773 /* Resources */,
            );
            buildRules = (
            );
            dependencies = (
                ACA3E4FD139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E4FF139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E501139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E503139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E505139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E507139FF83300AA4841 /* PBXTargetDependency */,
                ACA3E509139FF83300AA4841 /* PBXTargetDependency */,

            );
            name = Mug;
            productName = Mug;
            productReference = AC1F27E81398C2AC00C42773 /* Mug.app */;
            productType = "com.apple.product-type.application";
        };
...

PBXNativeTarget 섹션의 dependencies 목록에서 항목을 하나씩 제거해보면서 프로젝트를 다시 열어 Crash가 일어나는지 확인하자. (가장 최근에 추가된 맨 아래 항목이 문제의 원인일 가능성이 높다) 위 항목을 제거하면서, 다음 PBXTargetDependency 섹션과 PBXContainerItemProxy  섹션에서도 해당 항목을 제거해야 한다 :

/* Begin PBXTargetDependency section */
        ACA3E4FD139FF83300AA4841 /* PBXTargetDependency */ = {
            isa = PBXTargetDependency;
            name = Three20UI;
            targetProxy = ACA3E4FC139FF83300AA4841 /* PBXContainerItemProxy */;
        };
        ACA3E4FF139FF83300AA4841 /* PBXTargetDependency */ = {
            isa = PBXTargetDependency;
            name = Three20UINavigator;
            targetProxy = ACA3E4FE139FF83300AA4841 /* PBXContainerItemProxy */;
...

 

/* Begin PBXContainerItemProxy section */
        ACA3E4D3139FF7FE00AA4841 /* PBXContainerItemProxy */ = {
            isa = PBXContainerItemProxy;
            containerPortal = ACA3E496139FF7FD00AA4841 /* Three20.xcodeproj */;
            proxyType = 2;
            remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2;
            remoteInfo = Three20;
        };
        ACA3E4D5139FF7FE00AA4841 /* PBXContainerItemProxy */ = {
            isa = PBXContainerItemProxy;
            containerPortal = ACA3E496139FF7FD00AA4841 /* Three20.xcodeproj */;
            proxyType = 2;
            remoteGlobalIDString = EB9E6C6210B6A8F800DE563C;
            remoteInfo = Three20UnitTests;
        };
...