LLDB除錯

馬萬旻發表於2018-07-02

LLDB是Xcode自帶的除錯工具,既可以在本地除錯Mac程式,也可以在遠端除錯iPhone程式。當使用Xcode除錯遠端裝置時(iPhone),Xcode會講debugserver檔案複製到裝置中(路徑:/Developer/usr/bin/,可以檢視md5值確定是同一個),以便在裝置上啟動一個服務,等待Xcode進行遠端除錯。但是debugserver預設只能除錯自己開發的APP,除錯AppStore下載的app時,會報錯error: failed to attach process 8487: unable to start the exception thread Exiting.

debugserver

debugserver執行在iOS上,顧名思義,它作為服務端,實際執行LLDB(作為客戶端)傳過來的命令,再把執行結果反饋給LLDB,顯示給使用者,即所謂的“遠端除錯”。

為了除錯其他app,我們需要對debugserver檔案進行操作。

  1. 賦予debugserver檔案task_for_pid許可權。

    • 複製debugserver檔案,可以使用scp命令或者直接使用ifunbox等工具。
    $ scp -P 12345 root@localhost:/Developer/usr/bin/debugserver ~/Desktop
    複製程式碼
    • 簽名許可權
      簽名許可權有兩種修改方式:

      • 使用codesign進行簽名 新建許可權檔案entitlements.plist,寫入以下內容:

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
        <dict>
            <key>com.apple.springboard.debugapplications</key>
            <true/>
            <key>run-unsigned-code</key>
            <true/>
            <key>get-task-allow</key>
            <true/>
            <key>task_for_pid-allow</key>
            <true/>
        </dict>
        </plist>
        複製程式碼

        使用codesign進行簽名,命令如下:

        $ codesign -s - --entitlements entitlements.plist -f debugserver
        複製程式碼
      • 使用ldid進行簽名
        匯出debugserver的entitlements檔案

        $ ldid -e debugserver > debugserver.entitlements
        複製程式碼

        增加以下內容

        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        複製程式碼

        使用ldid進行重簽名

        $ ldid -Sdebugserver.entitlements debugserver
        複製程式碼
    • 將debugserver複製回手機,複製到手機的/usr/bin目錄下。

    $ scp -P 12345 ~/Desktop/debugserver root@localhost:/usr/bin/
    複製程式碼
  2. 進行除錯
    使用openSSH類似,建議做埠轉發後,使用usb進行除錯,速度更快。將本機的1234埠轉發到裝置的1234埠。

    1. 找到目標程式 $ ps -A或者$ ps aux
    2. 輸入$ debugserver *:1234 -a 應用名稱/PID,命令執行後,進入連結等待狀態,被除錯的程式會卡住。
    3. Mac終端輸入$ lldb進入lldb除錯狀態
    4. 通過$ process connect connect://localhost:1234命令進行連線,連線完成後,目標程式處於暫停狀態,輸入$ c跳過。
    5. 在執行過程中,使用Control + C暫停程式,進行除錯。

相關文章