背景:
经常做aosp开发时候,主要分为2部分代码:
java部分代码 ----> 使用Android Studio进行查看
c++/c部分代码 ---->使用VSCode进行代码查看
对于代码调试,原来也只实战讲解过Java代码在Android Studio进行Debug,虽然Debug不适用于所有场景,但是在分析源码堆栈,调用关系时候还是非常有作用,所以学员朋友们也一直希望native 代码也有很方便的调试Debug方法,可以看到native代码的调用堆栈,这样也可以大大提高native代码的分析效率。
在克服各种困难验证后,马哥这边给大家验证了一种比较方便的VSCode的调试方法。
(ps:为啥没有用 Android Studio for Platform工具,主要还是稳定性,它很容易卡死,加载太慢,因为要加载东西太多)
前置工作:
条件1:
需要有aosp15源码环境,并且已经编译成功
条件2:
需要有VSCode,并且要安装好两个插件
LLDB调试插件
条件3:
aosp15代码的话,确定自己安装了python3.10+环境
比如python3.8环境,则会报错
TypeError: unsupported operand type(s) for |: ‘type’ and ‘NoneType’
aosp15$ lldbclient.py -p $(adb shell pidof audioserver) --setup-forwarding vscode-lldb
Traceback (most recent call last):
File "aosp15/development/scripts/lldbclient.py", line 50, in <module>
def get_lldb_path(toolchain_path: str) -> str | None:
TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'
至于python3.10安装方法如下:
从源码编译安装(适用于自定义配置)
安装编译依赖
sudo apt install build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libsqlite3-dev # 基础编译工具链
下载并解压源码包
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz # 下载指定版本源码
tar -xvf Python-3.10.0.tgz # 解压源码包
cd Python-3.10.0
编译与安装
./configure --enable-optimizations
make -j$(nproc) # 多线程编译加速
sudo make install # 安装到系统目录
链接系统python3到python3.10
修改前,发现python3链接是python3.8
/usr/bin$ ls -l | grep python3
lrwxrwxrwx 1 root root 23 Mar 19 04:04 pdb3.8 -> ../lib/python3.8/pdb.py
lrwxrwxrwx 1 root root 31 Jun 4 2022 py3versions -> ../share/python3/py3versions.py
lrwxrwxrwx 1 root root 9 Apr 16 15:19 python3 -> python3.8
-rwxr-xr-x 1 root root 5490456 Mar 19 04:04 python3.8
lrwxrwxrwx 1 root root 33 Mar 19 04:04 python3.8-config -> x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root 16 Mar 13 2020 python3-config -> python3.8-config
-rwxr-xr-x 1 root root 384 Jan 25 2023 python3-futurize
-rwxr-xr-x 1 root root 388 Jan 25 2023 python3-pasteurize
-rwxr-xr-x 1 root root 3241 Mar 19 04:04 x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root 33 Mar 13 2020 x86_64-linux-gnu-python3-config -> x86_64-linux-gnu-python3.8-config
删除原python3的链接,链接到python3.10
test@test:/usr/bin$ sudo rm python3
test@test:/usr/bin$ sudo ln -s ../local/bin/python3.10 python3
然后确认一下版本
test@test:/usr/bin$ python3 --version
Python 3.10.11
如果不想升级高版本python,那么可以考虑拷贝老版本aosp14的lldbclient.py 覆盖aosp15的
正式开始调试:
第一步:进行源码环境的env操作
source build/envsetup.sh;lunch sdk_phone64_x86_64-trunk_staging-eng
第二步:启动lldbclient.py部分
命令格式:
lldbclient.py -p 进程pid号 --setup-forwarding vscode-lldb
audioserver为案例:
aosp15$ lldbclient.py -p $(adb shell pidof audioserver) --setup-forwarding vscode-lldb
Connecting to tracing pid 3124 using local port 5039
{
"name": "(lldbclient.py) Attach audioserver (port: 5039)",
"type": "lldb",
"request": "custom",
"relativePathBase": "/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15",
"sourceMap": {
"/b/f/w": "/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15",
"": "/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15",
".": "/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15"
},
"initCommands": [
"settings append target.exec-search-paths /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/ /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/hw /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/ssl/engines /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/drm /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/egl /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/lib64/soundfx /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/vendor/lib64/ /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/vendor/lib64/hw /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/vendor/lib64/egl /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/apex/com.android.runtime/bin"
],
"targetCreateCommands": [
"target create /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/system/bin/audioserver",
"target modules search-paths add / /media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/aosp15/out/target/product/emu64x/symbols/"
],
"processCreateCommands": [
"gdb-remote 5039"
]
}
Paste the above json into .vscode/launch.json and start the debugger as
normal.
Press enter in this terminal once debugging is finished to shut lldb-server
down and close all the ports.
Press enter to shut down lldb-server
这里的输出内容很重要,会为下面VSCode填写提供依据,大家注意这里最后有一个提示
Press enter to shut down lldb-server
大家切勿点击enter键,除非想要停止调试
第三步VSCode部分
点击VSCode的Run --> Add Configuration
把第二步lldbclient.py执行输出的内容,拷贝到这个lunch.json文件的configurations中
第四步设置断点进行调试
对自己感兴趣代码进行断点设置
*然后可以点击开始调试,或者按F5
出现如下导航栏就代表可以:
还会有相关终端调试日志的打印:
注意这里如果有啥报错也会打印出来
对应变量查看
注意:
在开启调试过程中发现偶尔会出现如下报错
error: Connection shut down by remote side while waiting for reply to initial handshake packet
这个报错暂时也没深入查找原因,重启模拟器设备后,重新调试就好了,大家也可以尝试重启adb reboot既可以解决
更多framework实战开发,请关注下面“千里马学框架”