本頁詳細介紹如何使用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 偵錯器附加:
- 轉到“設定”>“開發人員選項”>“選擇偵錯應用程式”並從清單中選擇您的應用程序,然後按一下“等待偵錯器” 。
- 從啟動器或使用命令列運行來啟動應用程式:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- 等待應用程式載入並出現一個對話框,告訴您應用程式正在等待偵錯器。
- 正常連線
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 偵錯程式碼:
- 確保執行
lldbclient.py
或lldbclient.py
所需的所有建置工件(例如符號)均存在。 - 在 VS Code 中,按Ctrl+Shift+P執行指令,搜尋Debug: Add Configuration... ,然後選擇LLDB 。這將開啟一個
launch.json
檔案並將一個新的 JSON 物件新增到清單中。 - 將新新增的偵錯器設定替換為兩個註解行 -
// #lldbclient-generated-begin
和// #lldbclient-generated-end
,以便您的設定清單如下:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
使用這些註解來偵測在哪裡寫入設定。如果清單中還有其他項目,請將註解行新增到其他配置後面的結尾。 - 在執行
envsetup.sh
和lunch
的終端機中執行以下命令: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
標誌,則該標誌必須是最後一個標誌。 - 開啟“運行和調試”側欄 - 新配置應出現在調試器清單中。按開始調試 (F5) 。調試器應在 10 到 30 秒後連接。
如果新配置未出現在「執行與偵錯」檢視中,請重新載入視窗以刷新偵錯器清單 - 按Ctrl+Shift+P並鍵入
reload window
。 - 偵錯完成後,進入執行
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 擴充功能的使用者手冊中找到可用屬性的概述。 , 本頁詳細介紹如何使用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 偵錯器附加:
- 轉到“設定”>“開發人員選項”>“選擇偵錯應用程式”並從清單中選擇您的應用程序,然後按一下“等待偵錯器” 。
- 從啟動器或使用命令列運行來啟動應用程式:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- 等待應用程式載入並出現一個對話框,告訴您應用程式正在等待偵錯器。
- 正常連線
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 偵錯程式碼:
- 確保執行
lldbclient.py
或lldbclient.py
所需的所有建置工件(例如符號)均存在。 - 在 VS Code 中,按Ctrl+Shift+P執行指令,搜尋Debug: Add Configuration... ,然後選擇LLDB 。這將開啟一個
launch.json
檔案並將一個新的 JSON 物件新增到清單中。 - 將新新增的偵錯器設定替換為兩個註解行 -
// #lldbclient-generated-begin
和// #lldbclient-generated-end
,以便您的設定清單如下:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
使用這些註解來偵測在哪裡寫入設定。如果清單中還有其他項目,請將註解行新增到其他配置後面的結尾。 - 在執行
envsetup.sh
和lunch
的終端機中執行以下命令: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
標誌,則該標誌必須是最後一個標誌。 - 開啟“運行和調試”側欄 - 新配置應出現在調試器清單中。按開始調試 (F5) 。調試器應在 10 到 30 秒後連接。
如果新配置未出現在「執行與偵錯」檢視中,請重新載入視窗以刷新偵錯器清單 - 按Ctrl+Shift+P並鍵入
reload window
。 - 偵錯完成後,進入執行
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 擴充功能的使用者手冊中找到可用屬性的概述。 , 本頁詳細介紹如何使用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 偵錯器附加:
- 轉到“設定”>“開發人員選項”>“選擇偵錯應用程式”並從清單中選擇您的應用程序,然後按一下“等待偵錯器” 。
- 從啟動器或使用命令列運行來啟動應用程式:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- 等待應用程式載入並出現一個對話框,告訴您應用程式正在等待偵錯器。
- 正常連線
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 偵錯程式碼:
- 確保執行
lldbclient.py
或lldbclient.py
所需的所有建置工件(例如符號)均存在。 - 在 VS Code 中,按Ctrl+Shift+P執行指令,搜尋Debug: Add Configuration... ,然後選擇LLDB 。這將開啟一個
launch.json
檔案並將一個新的 JSON 物件新增到清單中。 - 將新新增的偵錯器設定替換為兩個註解行 -
// #lldbclient-generated-begin
和// #lldbclient-generated-end
,以便您的設定清單如下:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
使用這些註解來偵測在哪裡寫入設定。如果清單中還有其他項目,請將註解行新增到其他配置後面的結尾。 - 在執行
envsetup.sh
和lunch
的終端機中執行以下命令: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
標誌,則該標誌必須是最後一個標誌。 - 開啟“運行和調試”側欄 - 新配置應出現在調試器清單中。按開始調試 (F5) 。調試器應在 10 到 30 秒後連接。
如果新配置未出現在「運行和偵錯」檢視中,請重新載入視窗以刷新偵錯器清單 - 按Ctrl+Shift+P並鍵入
reload window
。 - 偵錯完成後,進入執行
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 擴充功能的使用者手冊中找到可用屬性的概述。