首页 > 代码库 > android NDK开发在本地C/C++源代码中设置断点单步调试详细教程
android NDK开发在本地C/C++源代码中设置断点单步调试详细教程
最近在学android NDK开发,折腾了一天,终于能够成功在ADT中设置断点单步调试本地C/C++源代码了。网上关于这方面的资料太少了,而且大都不全,并且调试过程中会出现各种各样的问题,真是很磨人,程序猿就得有耐心。把自己的调试过程记录下来,希望对需要的朋友有帮助。
在看本文之前,请先确保你已经成功编译了一个android NDK工程,并且能够在模拟器或者真机上运行。至于怎么编译NDK工程,包括配置、生成.so文件等等,可以参考我的前一篇博客:http://blog.csdn.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函数的地方加上断点,如下图:
二、打开jni文件夹下的cpp文件,根据需要设置断点,如下图:
三、设置工程为可调试模式:
在AndroidManifest的Application中设置Debuggable的值为true,如下图:
注:在C/C++ Build中的Builder Settings下也要设置ndk-build NDK_DEBUG=1
四、打开Cygwin,用cd命令定位到工程目录下,我的是 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那个按钮(由于当时没有截图,反正有3个按钮,你点中间那个),把jni文件夹下的cpp文件加进来。如果控制台显示如下图,你直接忽略错误,点Yes,这个时候如果不出意外,就会跳进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代码中恰当位置延迟几秒钟,这样就能保证程序执行到断点处本地调试程序已经开启。
能调试成功不容易啊,各位朋友如果遇到了问题,可以在博客下给我留言,我尽力帮忙解决。
android NDK开发在本地C/C++源代码中设置断点单步调试详细教程