2017-08-31 108 views
6

在Xcode 7和8中,我已經能夠通過在包含框架項目的xcworkspace中運行包含應用程序來調試我一直在開發的框架。如果我在框架中設置斷點,它們將在運行時觸發。Xcode 9 - Framework breakpoints

在Xcode 9 beta 6中,這不再是這種情況。到目前爲止,在模擬器上進行調試時,執行僅停留在框架斷點處。當我在物理設備上進行調試時,框架斷點不會停止執行,它看起來完全被忽略。

如何讓框架斷點正常工作以便在Xcode 9中調試iOS 11上的框架?

FWIW:xcworkspace是通過在框架根目錄內運行pod install創建的。然後我將示例應用程序的xcodeproj添加到xcworkspace。此功能一直運行,直到在Xcode 9 beta 6上進行測試。

編輯:確認此行爲仍然發生在Xcode 9.0的GM種子上。

+0

你編譯的是什麼swift/objc優化標誌?如果你使用了一些,我建議從你的項目和框架的開發配置中刪除它們,然後看看你的調試器是否能夠更好地工作。 – trupin

+0

在xcode 9 beta中工作良好6.確保您的項目在DEBUG中運行 – amar

回答

1

TL; DR - 我需要更改我的存檔腳本在調試時或準備發佈時讀取的目錄。現在,在調試時,如果我希望斷點在運行時正常工作,我需要確保將我的框架方案的存檔配置設置爲「調試」。準備生產就緒框架時,我只使用「Release」。

我通過bug報告聯繫了Apple開發人員支持。我會粘貼下面的回覆。當他提到「lipo」時,他指的是我在後期存檔腳本中所做的一個調用,它會從模擬器和物理設備構建中創建一個通用框架。

Xcode必須匹配運行中的二進制文件,而該文件仍在計算機上。Xcode應該會自動執行此操作,但聽起來像是一些東西在Xcode背後移動。要知道調試信息是否與您匹配,可以查看 (lldb)圖像列表 和 的輸出/ Mac/path/to/Build/Products/Debug-iphoneos%dwarfdump --uuid iOS-App.app/iOS-應用程序 也將在dylibs上工作。

你的框架在地址周圍是否有括號?這是一個肯定的跡象,lldb無法找到你的符號。

如果映像列表中的UUID與dwarfdump不匹配,那麼在可執行文件運行前修改了可執行文件並且與您的構建產品不匹配。我們不確定是否可以做到這一點,我看到你的劇本,但絕對檢查。如果debug-info不再存在,那麼可以做的不多。

如果你能找到與你的磁盤上的匹配UUID正確的可執行文件,你可以簡單地 (LLDB)圖像添加/Mac/path/to/DerivedData-asdfasdfadf/Products/Debug-iphoneos/iOS-App.app /框架/框架

此外,Xcode使用Spotlight在您的機器上查找符號。爲避免在構建時不斷重新建立索引,將包含.o文件的Intermediates /目錄和存儲調試信息的其他位置列入黑名單。這在Xcode 9.0中發生得相當晚,所以可能是你的東西以前工作的原因。

當我跑(lldb) image list在運行時,我看到我的框架的UUID不匹配這是在/Mac/path/to/Build/Products/Debug-iphoneos報道dwarfdump

我最終修改了我的post-archive腳本,以便在創建框架時更改它從中讀取的構建目錄。當我將存檔配置設置爲「調試」時,它現在將從Debug-iphoneos中讀取。當我將它設置爲「釋放」從${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}

# NOTE: This script creates a universal framework (device and simulator). However, *** for this to work: a Simulator target must be built first, and then Archive on the Device *** 

BUILD_PRODUCTS="${SYMROOT}/../../../../Products" 
SIM_PATH="${BUILD_PRODUCTS}/Debug-iphonesimulator/${TARGET_NAME}.framework" 
if [ "${CONFIGURATION}" = "Debug" ]; then 
DEV_PATH="${BUILD_PRODUCTS}/Debug-iphoneos/${TARGET_NAME}.framework" 
elif [ "${CONFIGURATION}" = "Release" ]; then 
DEV_PATH="${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${TARGET_NAME}.framework" 
fi 
DEST_PATH="${PROJECT_DIR}/../Frameworks/${TARGET_NAME}.framework" 

rm -rf "${DEST_PATH}" 
mkdir "${DEST_PATH}" 
cp -r "${DEV_PATH}/" "${DEST_PATH}/" 
rm -f "${DEST_PATH}/${TARGET_NAME}" 
cp -Rn "${SIM_PATH}/Modules/" "${DEST_PATH}/Modules/" 

lipo -create "${SIM_PATH}/${TARGET_NAME}" "${DEV_PATH}/${TARGET_NAME}" -output "${DEST_PATH}/${TARGET_NAME}" 

讀取如果路徑是混亂的,我不怪你。實質上,工作區看起來像:

RootDirectory 
|__SampleApp 
    |__SampleApp.xcodeproj 
|__Frameworks 
    |__MyFramework.framework 
    |__AnotherFramework.framework 
|__MyFramework 
    |__MyFramework.xcworkspace 
    |__MyFramework.xcodeproj 
    |__Podfile (etc..) 
0

我的情況是:

我有我的其他路徑框架。當我構建它時,通常我會得到.framework。然後我將該框架(MyFramework.framework)文件添加到我的項目中。

我的建議是:

  1. 框架調用前添加一個新的突破點。這樣

enter image description here

  • 按此步跳入按鈕,當程序執行到斷點處。
  • enter image description here

    現在的執行將進入你的框架的源區,在這一點上,你必須添加新斷點曾經在您的框架想去的地方。

    這是Xcode 9和iOS 11中的工作解決方案。我希望這對您有所幫助。祝你好運。