Android ndk-gdb 调试

前提:保证NDK环境建立ok,可参考文章“Windwos下Android NDK开发环境搭建

若想在设备上使用,必须取得root权限才可。

注意在/home/用户/.bash_profile中环境变量的配置:

以上配置是为保证编译,调试过程能正确使用相关命令。

接下来以调试android ndk下samples中的hello-jni为例,来阐述调试过程。

由于:

The new NDK has a Windows version of ndk-build, but ndk-gdb is still a
bash script. This doesn't only mean that you need Cygwin to run it, it
also means that everything written in ndk-gdb is written from a Linux
standpoint.

所以,在windows下要用ndk-gdb的话,我们必须安装Cygwin.

如果在Windwos下运行ndk-gdb的话,将会出现如下问题。

值得注意的是,我们还必须在Cygwin中,配置ANDROID_NDK_ROOT这个环境变量,配置方法参见”Windwos下Android NDK开发环境搭建“中所描述。

否则在使用ndk-build会出现如下问题:

awk fatal:Can't open source file ‘/cygdrive/d/android-ndk-r5c/samples/hello-jni/ D:\android-ndk-r5c/build/awk/check-awk.awk' for reading (no such file or directory)
Error:Could not run 'awk' command.Do you have it install properly?

解决方法来自:https://groups.google.com/forum/#!msg/android-ndk/_4JNdY_h558/vdzP-4CkQrUJ

接下来,将按照如下步骤来调试。

1、启动Cygwin Terminal.

2、进入hello-jni的Android工程目录

    $ cd $ANDROID_NDK_ROOT/samples/hello-jni

3、以调试模式构建c/c++程序,目的是生成共享库,.so文件

  $ ndk-build NDK_DEBUG=1

这里我们使用 ndk-build NDK_DEBUG=1 生成带符号表的 .so

或者修改AndroidManifest.xml,设置android:debuggable=true。

注意:从上面执行的结果可看到,除了得到编译的动态共享库,还有Gdbserver和Gdbsetup。如果不是设置为调试模式不会产生这两个文件。

4、生成build.xml文件(用于用ant打包生成apk,见下面的步骤5)

   $ android update project -p . -t android-18   (在cygwin下,$ android.bat update project -p . -t android-18)

 

5、$ ant debug install

注1:如果在构建过程中出现如下错误:

[aapt] invalid resource directory name: C:\Users\Paul\git\XXXXXXXX\bin\res/crunch
在网上找到如下的解决方法:

本人是通过执行“ant clean debug install”来解决以上错误的。
注2:如果没构建的工程,涉及到库工程。则在构建过程中可能会出现类似如下错误:

则需在库工程目录下,为库工程执行“ android.bat update project -p . -t android-18”来生成需要的build.xml文件。

6、启动应用程序的ndk-gdb调试。

如果你要调试的程序没有运行,需使用ndk-gdb --start。

如果你要调试的程序已经在运行了,直接运行ndk-gdb。

$ ndk-gdb --start

 

这时会启动应用,接着就可以使用gdb的命令了。

7、用list或l命令查看C文件的内容.

(gdb) list

可以用list 1,100 或 l 1,100来指定显示源文件的范围。

如果遇到No symbol table is loaded. Use the "file" command.则需使用以下命令加载需要调试的so文件:
 file obj/local/armeabi/libhello-jni.so

8、用break 或 b命令设定断点

(gdb) break 30 //将断点设置在30行

9、查看断点信息
(gdb) info breakpoints


10、使用c或者continue命令继续运行程序。
(gdb) continue   

11、 按返回键再手动重启应用(触发程序运行在断点处),就会停在30行断点处了。(注意:如果停止了应用程序是不行的)

12、为了使程序继续运行下去,执行continue命令。

注:在调试其他native程序时,如果在第10步出现错误:
  出现错误:
  Continuing.
  Warning:
  Cannot insert breakpoint 1.
  Error accessing memory address 0x11a0: Input/output error.
 错误原因:使用ndk-gdb --start 启动程序第一个activity,但是此时so文件并没有被加载。
 解决方法:首先打开程序并使用,在保证so文件已经被使用的情况下,调用ndk-gdb命令调试程序进程。


posted on 2013-10-01 12:58  青山隐隐,绿水迢迢  阅读(7381)  评论(0编辑  收藏  举报