放在 jniLibs 里面的带调试符号的第三方库,在用AS调试应用,或者打debug包的时候,默认也会被去除调试符号,导致无法调试
可以在项目级别的 build.gradle 中的 android.buildTypes.debug 中添加
packagingOptions {
doNotStrip "**/*.so"
}
这样调试的时候,动态库就会带有调试符号。
使用 adb 或者 lldb 远程调试的时候有多个设备怎么选择
对于adb有两种方法:
- 使用 adb -s <serial_num> 来指定。serial_num 可以通过 adb devices 来获取
- 定义 ANDROID_SERIAL 环境变量。adb 会使用这个变量,优先链接
对应 lldb 只能通过定义 ANDROID_SERIAL 环境变量这种方式来指定目标设备
使用lldb 调试原生第三方库
- 保证应用加载的库确实有调试符号
- 在AS 中仅仅使用java 调试器,在调用c++代码前加上断点这样保证等待lldb 连接
- 运行 lldb server
adb shell
run-as <你的应用包名>
lldb/bin/lldb-server platform --server --listen unix-abstract:///data/local/tmp/debug.sock # socket 地址可以自定
- 在本机上使用 lldb
如果你有多个安卓设备保证 ANDROID_SERIAL 环境变量已经定义
lldb
platform set remote-android
platform connect unix-abstract-remote:///data/local/tmp/debu.sock
platform process list
# 查看输出里面的名字为app_process的pid
process attach -p <pid>
b <function_name> # 测试添加一个函数断点。这个断点当前无效,但是一会设置了源码路径会自动生效
setttings set target.source-map <so中源码的路径> <映射到本机文件的路径>
此时你在AS中恢复程序运行,程序就会在需要调用那个函数前被lldb捕获阻塞住
在lldb中你使用 continue 指令就可以开始调试了
网友评论