发现,具有十几年研发经验的Android大佬,也有很多都没能折腾出来怎么使用lldb远程调试SurfaceFlinger,看来这个东西经验很重要,特此记录,让有缘人少走弯路。
1. 任务
在服务器上使用lldb远程调试设备端Surfaceflinger。
2. 环境
- 编译Android的Linux服务器;
- 一台测试用的Android手机或者Android虚拟机;
- Linux服务器与Android手机处于同一个网段;
3. 准备
- Android 13 整套源码;
- 编译通过SurfaceFlinger;
- source build/<…setup>.sh
- lunch <…>
4. 获取lldb配置命令
运行:lldbclient.py -n surfaceflinger
会提示没有adb设备,需要将Linux服务器上的adb识别到Android手机:
- 手机执行:adb root; adb tcpip 6666
- 服务器执行:adb connect <device-ip>:6666
lldbclient.py执行完成后,执行一系列lldb配置,比如 source-map、target create等等,我们被这些 lldb配置命令 记下来。
集中,target create与 file 命令等同。
然后输入quit退出界面。
5. lldb.sh和lldb-server
在Android代码库中搜索: find . -name lldb.sh,选择一个与设备匹配的lldb.sh文件。
在Android代码库中搜索: find . -name lldb-server,选择一个与设备匹配的lldb-server文件。
Linux服务器执行: adb push <path to lldb-server> /data/local/tmp/ 手机执行:/data/local/tmp/lldb-server p –server –listen *:7777 Linux服务器执行:
- lldb.sh 进入 lldb命令行
- platform select remote-android # 如果不对,可以通过platform list 来查看具体的平台名称
- 把刚才记录下来的 lldb配置命令 抄一遍
- platform connect connect://<device ip>:7777
- attach <the pid of surfaceflinger>
到此完毕,一般已经成功进入surfaceflinger调试状态。
6. 调试
在 lldb 调试命令行中
- 先输入 c,保证surfaceflinger不会hung
- 设备断点: b <c++ 命令空间>:<function>, 或者 b <cpp file>:<行号>
- (操作手机,触发断点)
- 获得调用栈:bt
其它调试命令参考lldb文档,与gdb类似。