android NDK开发在本地C/C++源码中设置断点单步调试具体教程

时间:2023-03-08 16:46:18

近期在学android NDK开发,折腾了一天,最终可以成功在ADT中设置断点单步调试本地C/C++源码了。网上关于这方面的资料太少了,并且大都不全,并且调试过程中会出现各种各样的问题,真是非常磨人。程序员就得有耐心。

把自己的调试过程记录下来。希望对须要的朋友有帮助。

在看本文之前,请先确保你已经成功编译了一个android NDKproject,而且可以在模拟器或者真机上执行。至于怎么编译NDKproject,包含配置、生成.so文件等等。可以參考我的前一篇博客:http://blog.****.net/u013149325/article/details/40375455

首先,说一下我的开发环境配置:

win7  64位

ADT版本号: v22.6.2(已经集成了eclipse、CDT,建议大家都用最新版的ADT)

NDK版本号:android-ndk-r10c

Cygwin:官网下载地址:http://cygwin.com/install.html

至于Cygwin的安装和环境变量配置,网上非常多资料,在此不再赘述。

注:我试了,必须使用Cygwin运行NDK中的ndk-gdb脚本。才干在ADT中进入C/C++的断点。

一、在java程序中第一次调用native函数的地方加上断点。例如以下图:

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

二、打开jni目录下的cpp文件,依据须要设置断点。例如以下图:

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE0OTMyNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

三、设置project为可调试模式:

在AndroidManifest的Application中设置Debuggable的值为true,例如以下图:

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

注:在C/C++ Build中的Builder Settings下也要设置ndk-build NDK_DEBUG=1

四、打开Cygwin。用cd命令定位到project文件夹下,我的是 cd  /cygdrive/f/练习/androidTest

然后运行ndk-gdb命令。我的是 $NDK_ROOT/ndk-gdb --verbose --force

注意:一定要加上--force。否则会报错:Another debug session running,Use --force to kill it

假设报出 No symbol table is loaded.  Use the "file" command
错误,则运行file命令把库加进来。例如以下:

file  obj/local/armeabi-v7a/libTest.so

运行list或者l命令。能够每次显示10行C++源码。

五、在ADT中 Debug As->Android Native Application,假设控制台报错找不到库,就点Load那个button(因为当时没有截图。反正有3个button。你点中间那个),把jni目录下的cpp文件加进来。假设控制台显演示样例如以下图。你直接忽略错误,点Yes,这个时候假设不出意外,就会跳进C++中设置的断点。

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE0OTMyNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

这个时候,我们就能够看到变量值、堆栈信息和一些汇编指令了。

注意:假设没有跳进你设置的断点,可能是本地调试还没開始程序就运行完成了,官网上也是这样解释的:

Note:
There is a delay of a few seconds between when the activity is launched and when native debugging starts. If your code is already executed by that point, then you won’t see the breakpoint being hit. So either put a breakpoint in code that is called repetitively,
or make sure that you call JNI code after you see that ndk-gdb has connected. 链接:http://tools.android.com/recent/usingthendkplugin

你能够在java代码中恰当位置延迟几秒钟,这样就能保证程序运行到断点处本地调试程序已经开启。

能调试成功不easy啊,各位朋友假设遇到了问题,能够在博客下给我留言。我尽力帮忙解决。