使用調試器

本頁詳細介紹如何使用LLDB進行作業系統開發。對於應用程式開發,請參閱偵錯應用程式,其中解釋如何使用 Android Studio GUI(基於 LLDB)。

不再支援或提供 GDB。如果您要從 GDB 切換到 LLDB,您可能應該先閱讀LLDB 教學。如果您是 GDB 專家用戶, GDB 到 LLDB 命令映射在過渡時非常有幫助。

先決條件

要使用調試器:

  • 使用常用的envsetup.sh指令設定建置環境。
  • 運行您在建置時使用的相同lunch命令。請注意,午餐項目應與您正在調試的設備完全匹配。如果午餐項目與連接的設備不匹配,您將收到以下形式的錯誤: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • 將您的裝置連接到機器。

有關設定環境的更多協助,請參閱設定環境

偵錯二進位檔案

要偵錯在電腦上建置的二進位文件,首先必須將二進位檔案複製到設備,然後啟動偵錯器。例如:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

調試正在運行的應用程式或進程

若要連接到正在執行的應用程式或本機守護程序,請使用帶有 PID 的lldbclient.py 。例如,若要偵錯 PID 1234 的進程,請在主機上執行下列命令:

lldbclient.py -p 1234

此腳本設定連接埠轉發,在裝置上啟動相應的遠端偵錯存根,在主機上啟動偵錯器,將其配置為查找符號,並將其連接到遠端偵錯存根。

調試本機進程啟動

若要在進程啟動時對其進行偵錯,請使用帶有-r選項的lldbclient.py 。例如,要偵錯ls /bin ,請在主機上執行以下命令:

lldbclient.py -r /system/bin/ls /bin

然後,在偵錯器提示符號下輸入continue

調試應用程式啟動

有時您希望在應用程式啟動時對其進行偵錯,例如當發生崩潰時,您希望單步執行程式碼以查看崩潰之前發生了什麼。在某些情況下可以附加,但在其他情況下是不可能的,因為應用程式會在您附加之前崩潰。 logwrapper方法(用於strace )並不總是有效,因為應用程式可能沒有開啟連接埠的權限,並且lldbserver繼承了該限制。

若要偵錯應用程式啟動,請使用「設定」中的開發人員選項來指示應用程式等待 Java 偵錯器附加:

  1. 轉到“設定”>“開發人員選項”>“選擇偵錯應用程式”並從清單中選擇您的應用程序,然後按一下“等待偵錯器”
  2. 從啟動器或使用命令列運行來啟動應用程式:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. 等待應用程式載入並出現一個對話框,告訴您應用程式正在等待偵錯器。
  4. 正常連線lldbserver / lldbclient ,設定斷點,然後繼續該程序。

要讓應用程式運行,請附加 Java 偵錯線協定 (JDWP) 偵錯器,例如 Java 偵錯器 (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

調試崩潰的應用程式或進程

如果您希望debuggerd掛起崩潰的進程以便可以附加偵錯器,請設定適當的屬性:

  • Android 11 之後
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 及更低
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow 及更低
    adb shell setprop debug.db.uid 999999
    

在通常的崩潰輸出結束時, debuggerd在 logcat 中提供複製和貼上指令,顯示如何將偵錯器連接到崩潰的進程。

使用 VS Code 進行偵錯

LLDB 支援在Visual Studio Code上偵錯平台程式碼。您可以使用 VS Code 偵錯器前端而不是 LLDB CLI 介面來控制和偵錯裝置上執行的本機程式碼。

在使用 VS Code 進行偵錯之前,請先安裝CodeLLDB 擴充功能

使用 VS Code 偵錯程式碼:

  1. 確保執行lldbclient.pylldbclient.py所需的所有建置工件(例如符號)均存在。
  2. 在 VS Code 中,按Ctrl+Shift+P執行指令,搜尋Debug: Add Configuration... ,然後選擇LLDB 。這將開啟一個launch.json檔案並將一個新的 JSON 物件新增到清單中。
  3. 將新新增的偵錯器設定替換為兩個註解行 - // #lldbclient-generated-begin// #lldbclient-generated-end ,以便您的設定清單如下:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py使用這些註解來偵測在哪裡寫入設定。如果清單中還有其他項目,請將註解行新增到其他配置後面的結尾。

  4. 在執行envsetup.shlunch的終端機中執行以下命令:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py將產生的設定寫入launch.json並繼續執行。這是預料之中的;不要殺死lldbclient.py程式。如果省略--vscode-launch-file腳本將列印 JSON 片段,您需要手動複製並貼上到launch.json中。

    如果由於工具解析標誌的方式而存在-r標誌,則該標誌必須是最後一個標誌。

  5. 開啟“運行和調試”側欄 - 新配置應出現在調試器清單中。按開始調試 (F5) 。調試器應在 10 到 30 秒後連接。

    如果新配置未出現在「運行和偵錯」檢視中,請重新載入視窗以刷新偵錯器清單 - 按Ctrl+Shift+P並鍵入reload window

  6. 偵錯完成後,進入執行lldbclient.py終端,按Enter鍵結束lldbclient.py程式。腳本的後續運行將在#lldbclient-generated註釋之間產生配置並替換舊內容,您不需要手動刪除它們。

若要將自訂屬性新增至產生的啟動配置中,您可以使用--vscode-launch-props標誌。例如:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
範例屬性將使 VS Code 在偵錯之前執行名為Build的任務,並將新的偵錯初始化步驟附加到腳本產生的步驟中。您可以在VS Code 文件CodeLLDB 擴充功能的使用者手冊中找到可用屬性的概述。