LidaDbg的设计初衷是调试release模式的源码以及没有源码的二进制程序,但这个属于高级主题,我们留着后面再写。今天,我们要分享的是将LidaDbg作为debug模式的源码调试器。
为啥要用LidaDbg呢?因为它轻量、方便、好用。对于我们这种很少写Java/Kotlin程序的人来说,用Android Studio实在是太不方便了。更何况,我那2012款老掉牙的MacBookPro,运行Android Studio也是费劲得不行。所以我一般都是NDK+LidaDbg+VSCode进行Android Native的开发,这个模式不吃电脑配置,很爽不是么?
简单讲,release模式的源码/二进制调试采用LidaDbg+IDA,debug模式的源码调试采用LidaDbg+VSCode,这个组合是我多年以来摸索出的绝佳组合,现在通过我的自媒体平台分享给所有需要的朋友们。
开始之前,我们先将前置条件准备好。打开VSCode,安装CodeLLDB插件,这个是LidaDbg的源码级调试前端操作台:
然后,去gitee/geekneo/LidaDbg下载LidaDbg相关文件,至此依赖的文件就算准备好了:
接下来,做好软件配置。首先把LidaDbg的服务端push进手机并启动:
adb push lidadbg_root/Android/LidaDbgServer-arm /data/local/tmp/adb shell chmod -R 755 /data/local/tmp/LidaDbgServer-arm//data/local/tmp/LidaDbgServer-arm/lidadbg-server&
然后在VSCode里面新建CodeLLDB调试器配置,并将内容修改如下:
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [ {"type": "lldb","request": "custom","name": "Remote Attach","initCommands": ["platform select remote-android","platform connect connect://localhost:30333","platform process attach -p 25252" ] } ]}
其中要注意request一定要改成custom,以便执行我们指定的initCommands。
然后,将手机LidaDbg调试器服务端口映射到本机:
adb forward tcp:30333 tcp:30333
至此,软件环境就准备好了。接下来,我们就可以进行NDK jni项目的源码级别调试了,注意编译的时候要加上调试模式,否则编译出来是release模式,如下:
NDK_DEBUG=1 ndk-build
为了方便我们attach,可以在程序启动的时候加一个等待的操作:
void lidadbg_waiting() { for (int i = 0; i < 10; i++) { sleep(2); printf("%d is waiting for debugger %d/10...", getpid(), i + 1); fflush(stdout); }}
拿到程序的pid修改platform process attach -p pid中的pid为实际的进程id值,快捷键F5启动attach,然后我们就可以愉快的在VSCode里面源码级调试Android jni程序了,调试体验和用Visual Studio调试Window Native差不多,非常好用,可以大大提高我们解bug的效率。
初次使用的时候配置略显繁琐,但是一旦配置好了之后,我们只需要改每次进程的pid就可以了。是不是很简单?扔掉Android Studio试试吧。
上述步骤适用于Android平台,那么iOS平台如何操作呢?毕竟对于Tweak类型的研发,源码调试的话Xcode是指望不上了。如果要用LidaDbg+VSCode源码级调试自研的Tweak Dylib插件,上述绝大部分步骤是一样的,唯一的区别是initCommands里面的localhost要改成iOS设备的真实IP地址,这样才可以正常调试。如果用usbmux等工具也做端口转发的话,是不能正常工作的,因为iOS版本的lldb-server与debugserver无法同时工作在同一端口映射之下。具体原因我没有去深究,因为填实际IP地址并不影响调试体验。感兴趣的朋友可以研究研究原因。
移动平台可以这样操作,那么PC平台可以吗?答案当然是肯定的,只要你有对应平台的lldb-server,均可以按照上述步骤配置,这样我们跨机跨架构源码级调试都是十分方便的。可喜的是,lldb-server几乎与gdbserver支持的平台一样多,很酷不是么?
好了,这篇文章介绍的内容没啥难度,普适性也强,关键是可以实实在在的提高你的开发效率,朋友们值得一试,刚把得。