使用調試器

本頁詳細介紹瞭如何使用LLDBGDB進行操作系統開發。對於應用程序開發,請參閱調試應用程序,其中解釋瞭如何使用 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
gdbclient.py --port 5038 -r /data/local/tmp/test.exe

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

要連接到正在運行的應用程序或本機守護程序,請使用帶有 PID 的gdbclient.py 。例如,要調試 PID 1234 的進程,請在主機上運行以下命令:

gdbclient.py -p 1234

該腳本設置端口轉發,在設備上啟動相應的遠程調試存根,在主機上啟動調試器,將其配置為查找符號,並將其連接到遠程調試存根。

調試本機進程啟動

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

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

然後,在調試器提示符下輸入continue

調試應用程序啟動

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

要調試應用程序啟動,請使用“設置”中的開發人員選項來指示應用程序等待 Java 調試器附加:

  1. 轉到“設置”>“開發人員選項”>“選擇調試應用程序”並從列表中選擇您的應用程序,然後單擊“等待調試器”
  2. 從啟動器或使用命令行運行來啟動應用程序:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. 等待應用程序加載並出現一個對話框,告訴您應用程序正在等待調試器。
  4. 正常附加gdbserver / gdbclient ,設置斷點,然後繼續該過程。

要讓應用程序運行,請附加 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 中提供複製和粘貼指令,顯示如何將調試器連接到崩潰的進程。

無符號調試

對於 32 位 ARM,如果沒有符號, gdb無法確定它正在反彙編哪個指令集(ARM 或 Thumb)。要指定在符號信息丟失時選擇作為默認指令集,請設置以下屬性:

set arm fallback-mode arm  # or thumb

使用 VS Code 進行調試

LLDB 支持在Visual Studio Code上調試平台代碼。您可以使用 VS Code 調試器前端而不是 LLDB CLI 界面來控制和調試設備上運行的本機代碼。

在使用 VS Code 進行調試之前,請先安裝CodeLLDB 擴展

使用 VS Code 調試代碼:

  1. 確保運行gdbclient.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 擴展的用戶手冊中找到可用屬性的概述。