XCode日常使用備忘錄

來源:互聯網
上載者:User

標籤:scheme   電腦   pil   app開發   靈活   ade   解決   多個   file   

0. Introduction

       XCode是macOS上開發app不可缺少的開發人員工具,不管是開發macOS上的應用,還是iOS上的應用,都離不開XCode環境。儘管其易用性廣受詬病,但由於蘋果app開發的封閉性,眾多開發人員也不有苦不能言。近年來微軟針對macOS平台發布了Visual Studio Code和Visual Studio for Mac這兩款開發工具,但是其目的顯然只是作為XCode的一種補充,要全盤替代XCode目前還不太現實。平時工作中由於負責開發維護Windows和Mac兩個平台的應用,因此常常需要用到XCode。但由於macOS系統本來就比較逆反,用慣了Winodws陡然切換到macOS,根本無所適從。對於XCode的使用更是如此。在此記錄下平時開發過程中經常用的操作,以免自己再次切換到macOS上時一臉懵逼。

1. Install name and Runpath      install name是個什麼玩意兒?簡單的說,是便於載入器dyld找到程式連結的庫檔案。一般情況下dyld在載入程式的時候,會去一些固定的路徑(如/usr/local/lib, /usr/lib)下尋找需要的庫檔案。如果沒有找到庫檔案,程式就會載入失敗並報錯。install name的出現就是為瞭解決這種問題,允許使用者把庫檔案放到其他位置,通過install name告訴dylb到哪去尋找這個庫檔案。      在XCode中用好install name需要設定兩個地方:(1)Build Settings->Linking,設定了Dynamic Library Install Name和Dynamic Library Install Name Base兩項。這裡用到了@rpath變數,其含義和用法在前面的部落格中有細說過。@rpath其實是“runpath”的縮寫,其值在第二步中設定。      (2)Build Settings->Runpath Search Paths,設定了runpath的搜尋路徑。在這一項裡面可以設定多個路徑。這裡設定的每個項都會替換@rpath,從而達到靈活設定多個位置的目的。可以在中看到,我們使用了@loader_path這個變數,其值實際上是可執行程式的所在位置。因此,假設可執行程式所在路徑為:/Users/zhangzhongke/Library/bin/test,@loader_path/../Resources”把上面設定的@rpath替換了之後就變成了:/Users/zhangzhongke/Library/bin/test/../Resources,實際也就是:/Users/zhangzhongke/Library/Resources/。我們這裡runpath只設定了一個值,實際上有需要可以設定多個值。       通過命令otool -L可查看dylib檔案的install name確實已經設定成了我們需要的值。其中:-L選項列印dylib所使用到的庫,-D列印dylib檔案的ID名。如果是修改其他動態庫,則可使用install_name_tool命令來修改。2. Header, Compiler and Build Locations       Build Settings->Build Locations可以修改編譯輸出位置。       Build Settings->Search Paths可設定編譯時間標頭檔和庫檔案的搜尋路徑。       Build Settings->Apple LLVM8.0-Language C++設定C++執行階段程式庫。有的項目中需要在libstdc++和libc++之間切換,否則編譯過程各種錯誤。 3. dSYM and App crashes

       dSYM是Debug Symbols的縮寫,也就是說dSYM裡面儲存的都是可執行程式的偵錯符號,對於Windows下Visual Studio產生的pdb檔案。儲存Release版的dSYM檔案對於程式崩潰時的調試可以說極為重要。偵錯符號檔案在調試中的作用其實非常簡單,就是把那些16進位值轉換為我們原始碼中對應的符號變數。這樣能夠協助開發人員快速定位到程式崩潰的地方,極大的提高調試效率。

      那麼怎麼利用偵錯符號檔案來偵錯工具崩潰呢?順便記錄下Windows的調試方法:(1)Windows下利用pdb檔案調試崩潰程式。首先要注意的是,要儲存好Release版的pdb檔案。最好發布程式時,把pdb檔案也一起打包進去。
  • 調試時使用windbg,需要設定好偵錯符號檔案和原始碼檔案(如果有)路徑:
  • Attach to a Process適用於動態庫等不能直接啟動並執行程式,Open Executable則適用於exe可執行程式。程式起來後,直接輸入g命令開始執行。在出現異常的地方運行命令:!analyze -v進行分析。windbg就能給出具體的崩潰的位置了。

(2)macOS下利用dSYM檔案調試崩潰程式。首先解釋下dSYM和DWARF的關係:

  •  DWARF是一種被眾多編譯器和調試器使用的用於支援原始碼層級調試的調試檔案格式。它滿足了許多程式語言的需求,比如C,C++和Fortran,而且被設計成可拓展到其它語言。DWARF是平台獨立的且適用於任何處理器任何作業系統。 DWARF廣泛應用於Unix,Linux和其它作業系統,以及獨立的環境中。
  • 為了避免進行stripping操作後偵錯符號的丟失,你可以使用dwarf-with-dsym選項. DWARF with dSYM 選項在標準的DWARF之外執行一個額外的步驟:建立一個單獨的MyApp.app.dSYM檔案,這個檔案包含你的程式的所有偵錯符號(這個檔案其實是一個包,可以通過右鍵->顯示包內容進行查看)。事實上,DWARF with dSYM選項允許你對你進行單步調試而不管可執行程式是否被剝離了調試資訊(stripped)。這是可能的,這是因為gdb將會在你的程式的目錄下尋找.dSYM檔案。它不需要知道對象檔案(object files)的名字或者路徑。

利用dSYM解析crash log的主要步驟如下:

(1)在調試之前,把xxx.crash、xxx.dSYM、symbolicatecrash三個檔案放到一個同一個檔案夾中。這裡symbolicatecrash是XCode命令列工具中的一個命令,可以把它拷貝過來,也可以建立符號連結。

ln -s /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /usr/bin/symbolicatecrash
在我的電腦上裝的是XCode8,symbolicatecrash的路徑為:/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash。如果找不到,可以使用命令:
find /Applications/Xcode.app/ -name symbolicatecrash -type f

(2)驗證app和dSYM的UUID是否一致:

dwarfdump --uuid YourApp.app/YourAppdwarfdump --uuid YourApp.app.dSYM

(3)解析Crash Log

./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash

      產生的symbol.crash就是解析後的崩潰記錄檔了,裡面的符號經過了轉換,閱讀上變得更加友好。另外,macOS系統上的日誌通常存放在如下幾個地方:

~/Library/Logs/DiagnosticReports/ (where ~ refers to your Home directory).~/Library/Logs/CrashReporter/MobileDevice are the crashlogs for your iOS devices (if any).~/Library/Logs/CrashReporter also has links to items in ~/Library/Logs/DiagnosticReports//var/log/system.log

  注意:Build Settings -> Build Options -> Debug Information Format中, 置成 DWARF是不會產生dSYM檔案的,必須選擇DWARF with dSYM File才會產生符號表檔案。

4. Target, Scheme and Group

      XCode中的Target類似Visual Studio中的Project,也就是說一個target可以單獨進行編譯,產生可執行程式。通常在XCode中建立一個項目時,預設會建立一個同名的Target。如果需要新增一個Target,在XCode的工具列選擇:File->New->Target即可。如:

      建立Target的時候選擇需要的項目類型即可。然後,在所示位置切換不同的Targets進行編譯。

      注意:如果要編譯不同的Targets一定要記得切換,這個功能如果Visual Studio中的“設定為啟動項目”:

      如果需要設定不同Targets的項目屬性,也需要進行Targets的切換:

      編輯Scheme,其實就是設定編譯類型:Debug或者Release,以及一些編譯動作。XCode裡面有Build, Run, Test, Profile, Analysis, Archive這幾個編譯動作,每個動作都有Debug和Release模式。在這兩種模式下設定不同的編譯參數。最常用的就是Run和Archive了。

      Group在XCode裡面的作用非常明確,就是用來在邏輯上對源檔案進行分類管理。邏輯上的意思是,它並不會建立物理上的分組,而僅僅是視覺上、邏輯上的劃分。所以有時候我們雖然在XCode中看到工程組織的井井有條,可是工程檔案夾中的檔案實際上是散落一片的。這個功能對於大型的項目功能劃分、檔案組織非常重要。中的New Group和New Group from Selection都是用來建立Group的,後者可以對選中的工程檔案建立Group。

 

5. Misc 
  • xcode-select:用於選擇不同版本的開發人員工具
  • xcodebuild和xcrun是打包時常用的兩個命令,xcodebuild負責編譯,xcrun負責將app打成ipa。
6. References
  • https://gist.github.com/zchee/7833bf67013e83523181
  • http://stackoverflow.com/questions/9600615/xcode-stops-working-after-set-xcode-select-switch
  • http://log.zyxar.com/blog/2012/03/10/install-name-on-os-x/
  • https://wincent.com/wiki/@executable_path,[email protected][email protected]
  • http://www.cimgf.com/2009/12/23/automatically-save-the-dsym-files/
  • http://www.cnblogs.com/max5945/p/3663966.html

XCode日常使用備忘錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.