2013-04-08 107 views
3

我正在開發的OS X 10.8的機器上使用的Xcode 4.6的應用程序。應用程序部署目標設置爲10.6,這是我們需要支持的。但是,當我將應用程序歸檔(編譯,鏈接和嵌入資源+框架)並將其部署(也就是複製)到10.6測試機器時,它會崩潰並出現通用的分段錯誤。它在10.7上正常工作。如何調試舊版Mac OS X的應用程序?

,因爲應用程序使用較新的編譯器(它使用ARC,隱式屬性合成,新的Objective-C的文字語法等)建立我不能編譯該項目在Xcode舊Mac上。它也不會進行類型檢查,因爲基本SDK是10.8,它引用了10.6機器上的編譯器不知道的10.8個令牌。

上如何去調試應用程序有什麼建議?

+0

約GDB什麼?只需啓動它的二進制文件 – cody 2013-04-08 14:56:31

+0

@cody我喜歡Xcode中的可視化調試器,特別是在我的源代碼中設置斷點。 – lms 2013-04-08 14:59:11

+0

你在說什麼10.8代幣?有沒有任何運行時條件或「'respondsToSelector:'」調用,這將允許10.6機器避開10.8特定的API? – 2013-04-08 14:59:31

回答

1

你很可能會使用在10.6的一個或多個10.7+的API崩潰。使用10.8目標SDK,您可以允許所有在該SDK中可用的調用功能。然而,應用程序遲到,所以當你沒有真正調用這些函數時,它不會崩潰。您需要與此類似(這裏爲全屏幕功能),明確檢查:

#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_6 
if (runningOnLionOrLater) { 
    [mainWindow setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary]; 
    [toggleFullscreenItem setHidden: NO]; 
} 
#endif 

一種方法來確定當前的版本是:

int macVersion; 
    if (Gestalt(gestaltSystemVersion, &macVersion) == noErr) { 
     runningOnLionOrLater = macVersion > MAC_OS_X_VERSION_10_6; 
    } 

爲了調試問題的調用只需將基地SDK到10.6和XCode應標記那些不可用的功能。

2

我不以任何方式與此公司/軟件有任何關聯,但Deploymate是一種付費應用程序,它可以掃描您的應用程序的SDK使用情況,並告訴您何時調用舊版操作系統版本上不可用的選擇器和API。這可以幫助您追蹤與API使用有關的異常和崩潰。

0

雖然沒有真正很好地解決這個(我已經看到了不同的MacOS版本只是不同的行爲),沒有辦法簡單地模仿一箇舊的MacOS版本,如果你有一臺機器不遺餘力:

它可以使用外部HD,對其進行分區並安裝不同的macOS版本。它們都可以啓動,並且對於每個操作系統版本重新啓動機器都很麻煩(痛苦)。