zoukankan      html  css  js  c++  java
  • android NDK开发在本地C/C++源码中设置断点单步调试具体教程

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

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

        在看本文之前,请先确保你已经成功编译了一个android NDKproject,而且可以在模拟器或者真机上执行。至于怎么编译NDKproject,包含配置、生成.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文件,依据须要设置断点。例如以下图:


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

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


        注:在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++中设置的断点。



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

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

    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啊,各位朋友假设遇到了问题,能够在博客下给我留言。我尽力帮忙解决。


  • 相关阅读:
    Java数据库操作(MySQL与SQLserver)
    LeetCode 11. 盛最多水的容器
    LeetCode 10.正则表达式匹配
    LeetCode 9.回文数
    LeetCode 7. 整数反转
    LeetCode 6.Z 字形变换
    LeetCode 4.寻找两个正序数组的中位数
    LeetCode 3. 无重复字符的最长子串
    JOI2020遗迹
    线性规划对偶
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6921004.html
Copyright © 2011-2022 走看看