首页 > 其他分享 >Android Native Code 手动调试

Android Native Code 手动调试

时间:2023-02-18 17:13:09浏览次数:57  
标签:Code package bundle server lldb Android data id Native

调试启动过程中的 Android Native Code Crash

记录一下,最后成功使用的工具是 lldb + lldb-server,不需要 root 权限。我最先尝试使用的是,gdb + gdb-server 在 attach 后总是 crash,总感觉指令集有点问题,尝试编译一个 target platform 是 arm64 的 gdb,但是也没有成功。要求调试的包需要设置 debuggable。 在设备上启动 lldb-server 首先是要把 lldb-server 推送到设备上,然后用包体的权限运行,然后让应用启动后等待调试。

在设备上启动 lldb-server

首先是要把 lldb-server 推送到设备上,然后用包体的权限运行,然后让应用启动后等待调试。
D:
cd D:\SDK\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\11.0.5\lib\linux\aarch64
adb push lldb-server /data/local/tmp
adb shell chmod +x /data/local/tmp/lldb-server
adb shell run-as package_bundle_id killall -9 lldb-server
sleep 1
adb shell run-as package_bundle_id cp /data/local/tmp/lldb-server /data/data/package_bundle_id/
adb shell am start -D -n "package_bundle_id/android.app.NativeActivity"
adb shell run-as package_bundle_id sh -c '/data/data/package_bundle_id/lldb-server platform --server --listen unix-abstract:///data/data/package_bundle_id/debug.socket'"

lldb attach 到目标进程

在 windows 上启动 lldb 客户端连接上设备上的 lldb-server ,然后 attach 到目标进程。
adb shell run-as package_bundle_id  ps
lldb
> platform select remote-android
> platform connect unix-abstract-connect:///data/data/package_bundle_id /debug.socket
> attach <pid>

jdb

jdb 连接上目标进程。

adb shell run-as package_bundle_id ps
adb forward tcp:12345 jdwp:<pid>
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345

lldb 调试

lldb: continue 后就可以调试目标app的启动流程了,另外 lldb: add-dsym *.sym 指令就可以添加符号文件了,还是挺方便的。  

关于权限问题:

root 用户直接设置全局 debuggable 试了没成功:

以前,设置 ro.debuggable = 1 后,可以用调试的方式启动 app, 并可以调试java层的代码,但是这次通过 lldb : attach 目标进程时,始终无法挂载,即使我用的是 root 权限运行的 lldb-server ,不太清楚 Android 是如何处理这块儿的权限的。

直接修改 apk 包 debuggable 权限:

不太想重新打包,直接用 apktool -d 解压后,修改 AndroidManifest.xml 后,再打回来,可行。

直接修改 aab 包 debuggable 权限

官方暂时还没有处理 aab 包体解包再打包的工具,StackOverflow 上的一些教程是通过 protoc 反序列化 AndroidManifest.xml 修改后重新插入 aab 包体。我试了,没成功,仍然没有调试权限,只能重新打包~

参考:

https://stackoverflow.com/questions/53733781/how-do-i-use-lldb-to-debug-c-code-on-android-on-command-line https://lldb.llvm.org/use/map.html 

标签:Code,package,bundle,server,lldb,Android,data,id,Native
From: https://www.cnblogs.com/codingMozart/p/17133051.html

相关文章