使用vscode + lldb-dap 调试鸿蒙的Native代码
使用vscode + lldb-dap 调试鸿蒙的Native代码
背景
鸿蒙的官方开发环境DevEco Studio调试NDK程序已经够用,但是调试大的项目如chromium经常的卡死和掉线,还有就是不能调试子进程,这就需要寻找一个其他的方法。
环境
系统环境:Win10
构建环境:wsl2
代码编写和调试环境: Win10 vscode
官方的配置
官方的文档 LLDB高性能调试器中给出了使用lldb + lldb-server 调试的基本步骤,但是是基于命令行的方式,操作起来比较难,还不能和现代的IDE结合起来,给开发和调试带来不少的问题。
官方的步骤:
省略hap包上传和启动的步骤,下面给出附加的步骤:
hdc shell aa attach -b com.huawei.ohos_chromium
hdc shell aa process -a EntryAbility -b com.huawei.ohos_chromium -D "/data/local/tmp/debugserver/com.huawei.ohos_chromium/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
启动lldb
(lldb) platform select remote-ohos
(lldb) platform connect unix-abstract-connect:///lldb-server/platform.sock
(lldb) settings append target.exec-search-path /path/chromium/src/out/musl_64
(lldb) settings append target.sorce-map . /path/chromium/src/out/musl_64
...
(lldb) attach {pid}
可以调试了。
官方的远程调试(附加)原理
可不可以通过lldb-server提供 tcp 的端口直接在外部使用lldb-server连接上去调试。经过尝试不行,对 鸿蒙官方仓库的 llvm源码分析,发现他的lldb是经过改造的,类似Android的改动,在 llvm/lldb/source/Plugin/Platform/OHOS 下,通过hdc 的 fport 映射 unix-abstract-connect:///lldb-server/platform.sock 到本地的端口,然后再通过PlatformLinux 来连接到这个映射的端口进行连接。
platform.sock --> hdc:fport --> localhost:port
vscode的lldb远程调试
- cppdbg
- lldb-dap
- codelldb
VSCODE提供的cppdbg 由于配置过于复杂放弃。
codelldb 目前使用的人数比较多,但是他提供的配置使用者自己提供 liblldb.dll的方式,由于 codelldb 使用lldb版本比较高无法使用DevEco Studio的lldb(15.2)。
lldb-dap 的配置 DevEco Studio 没有提供。
这就需要自己定制一个vscode的 lldb-dap 或者codelldb 支持的lldb
步骤从 鸿蒙的 官方仓库中移植 OHOS 的代码:
代码位置 llvm/lldb/source/Plugin/OHOS/*.
编译
lldb,lldb-dap
如果使用 codelld 编译lldb的时候需要打开python支持。
使用 codelldb 的配置:
codelldb的插件支持选进程,但是选完进程后端口(不清楚是platform.sock被释放,还是codelldb 会复用端口)会被关闭,导致程序附加错误。这个应该需要codelldb改动或者 鸿蒙的hdc 支持端口保留。
{
"inputs": [
{
"id": "pickExampleProcess",
"type": "command",
"command": "lldb.pickProcess",
"args": {
"initCommands": [
"log enable lldb all",
"platform select remote-ohos",
"platform connect unix-abstract-connect:///lldb-server/platform.sock",
],
}
}
],
"configurations": [
{
"type": "lldb",
"request": "attach",
"name": "Attach",
"initCommands": [
"log enable lldb all",
"platform select remote-ohos",
"platform connect unix-abstract-connect:///lldb-server/platform.sock",
],
"pid": "31139",
}
]
}
使用 lldb-dap的配置:
{
"version": "0.2.0",
"inputs": [
{
"id": "processId",
"type": "promptString",
"description": "请输入要附加的进程ID (PID)",
"default": ""
}
],
"configurations": [
{
"name": "Attach Debug",
"type": "lldb-dap",
"request": "attach",
"debugAdapterExecutable": "d:/ohos_lldb/bin/lldb-dap.exe",
"preRunCommands":[
// hdc shell aa attach -b com.huawei.ohos_chromium
// hdc shell aa process -a EntryAbility -b com.huawei.ohos_chromium -D "/data/local/tmp/debugserver/com.huawei.ohos_chromium/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
],
"initCommands": [
"platform select remote-ohos",
"platform connect unix-abstract-connect:///lldb-server/platform.sock",
// "platform process list --show-args --all-users",
"settings append target.exec-search-paths z:\\mnt\\wsl\\chromium\\src\\out\\musl_64\\lib.unstripped",
"settings append target.source-map . z:\\mnt\\wsl\\chromium\\src\\out\\musl_64",
],
"attachCommands": [
"attach ${input:processId}"
],
// "sourceMap":[
// [".", "Z:\\mnt\\wsl\\chromium\\src\\out\\musl_64"]
// ],
}
]
}

浙公网安备 33010602011771号