Android下用GDB调试.so的方法

来源:互联网 发布:linux内外网双网卡路由 编辑:程序博客网 时间:2024/05/08 18:12


Android下开发程序我一直认为是一件非常恶心的事情,特别是JNI开发,(或许是本人水平太差了)反正从以往来看,嵌入式开发中的调试都是一个难点。基本上都是一台主机比如Linux,然后另外的嵌入式平台,通过类似于TCP连接的东西,传输调试信息。


关于Android调试,网上有很多的文章, 但是我个人总觉得不是非常地好理解。

所以这里介绍一个例子,希望能对大家有所帮助。例子来源于Qgis工程,这是一个开源软件。这里面有一个用于debug的脚本,参考https://github.com/qgis/QGIS-Android/blob/master/scripts/debug-apk.sh

但是这个还挺麻烦的,不是太好理解。

OK我把里面的脚本搞出来:

/home/along/necessitas/android-sdk/platform-tools/adb shell am start -n org.qgis.qgis/org.kde.necessitas.origo.QgisActivity/home/along/necessitas/android-sdk/platform-tools/adb pull /system/bin/app_process /home/along/src/qgis/qgis-android/tmp/app_process/home/along/necessitas/android-sdk/platform-tools/adb pull /system/bin/linker /home/along/src/qgis/qgis-android/tmp/linker/home/along/necessitas/android-sdk/platform-tools/adb pull /system/lib/libc.so /home/along/src/qgis/qgis-android/tmp/libc.so
echo `/home/along/necessitas/android-sdk/platform-tools/adb shell top -n 1 | grep org.qgis.qgis`
第一步就是启动Android上的程序 org.qgis.qgis

第二步把上面的一些文件给拉下来,用于调试

第三步找到org.qgis.qgis的进程ID号,在下面有用


/home/along/necessitas/android-sdk/platform-tools/adb forward tcp:5039 localfilesystem:/data/data/org.qgis.qgis/debug-pipe/home/along/necessitas/android-sdk/platform-tools/adb shell run-as org.qgis.qgis /data/data/org.qgis.qgis/lib/gdbserver +debug-pipe --attach PID &/home/along/necessitas/android-9-standalonetoolchain/bin/arm-linux-androideabi-gdb -x /home/along/src/qgis/qgis-android/tmp/gdb.setup

再看,
第四步,启动调试桥
第五步,attach PID, 这个地方注意, 执行的时候,把PID换成上面查找出来的进程ID号。后面的 & 不能少指的是运行后转入后台。
第六步,让gdb执行一些命令,命令文件/home/along/src/qgis/qgis-android/tmp/gdb.setup如下所示:

file /home/along/src/qgis/android/tmp/app_processtarget remote :5039set solib-search-path /home/along/src/qgis/android/apk/libs/armeabi-v7adirectory /home/along/android-ndk/android-9-standalonetoolchain/sysroot/usr/include /home/along/src/qgis/master/src /home/along/src/qgis/android/srcbreak QgisApp::QgisApp


这个其实就是指定让gdb去哪些目录下搜索调试中用到的.so库文件,以及.cpp所在的路径。
然后在QgisApp这个类的构建函数停下来。


如果软件出了bug挂了,然后执行backtrace 回退查看函数调用堆栈。

如果软件刚开始就挂了,还是看LOG吧。

看LOG的方法,可以用eclipse,也可以用以下的脚本:里面定义了一些变量,请把他变成你需要的

set -eADB=<span style="font-family: Arial, Helvetica, sans-serif;">/home/along/necessitas/android-sdk/platform-tools/adb</span>$ADB kill-server$ADB devicesecho "" > /tmp/logcat.loggnome-system-log /tmp/logcat.log &$ADB logcat -c$ADB shell am force-stop org.qgis.qgis$ADB shell am start -n org.qgis.qgis/org.kde.necessitas.origo.qgisActivity$ADB logcat | tee /tmp/logcat.log



参考:

http://blog.chinaunix.net/uid-24439730-id-357096.html

 Android系统中调试动态链接库so文件的步骤

http://www.360doc.com/content/12/1114/19/10388890_247863542.shtml

http://blog.csdn.net/eqera/article/details/20230671
 Android中用gdb调试一启动就崩溃的程序:
http://blog.csdn.net/jinzhuojun/article/details/7393573

0 0
原创粉丝点击