Android中用gdb调试一启动就崩溃的程序

原创 2012年03月26日 10:32:01

原文地址:http://blog.csdn.net/ariesjzj/article/details/7393573

一般情况下程序是在某一个点挂掉的,我们可以用adb shell ps查到PID,然后在target端用gdbserver attach上去,最后在host端用gdb连上去调。但程序往往不会崩溃得这么完美,很多情况下程序一起来就crash掉了。这个时候分两种情况:1.真的是一起来就挂掉的。2.一起来后稍稍过会就挂掉的。

 

这里我用的系统是:

Host: Ubuntu x64

Target: Android ICS

 

方法一:针对第一种情况。首先在target的Android中运行Dev Tools->Development Settings,点按钮"None"选择你要调的程序(这里比如是flashplayer),然后选中Wait for debugger就可以退出了。Dev Tools在大多数情况下是默认安装的,但如果你很不幸地找不到,参照http://developer.android.com/guide/developing/debugging/debugging-devtools.html把emulator里的Dev Tools搬过来。

这时候打开要调的程序就会停住:

当然,这时候wait for debugger不是wait gdb,是DDMS。但因为我们最后是用gdb调,所以这时候要趁机用gdb attach上去。具体gdb的设置和使用请参见另一博文(http://blog.csdn.net/ariesjzj/article/details/7375048)。一般步骤是先在target开gdbserver,然后在host开gdb client:

jzj@jzj-laptop:~/debug$ gdb -x init.gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
...

__futex_syscall4 () at bionic/libc/arch-x86/bionic/atomics_x86.S:73
73     popl    %esi
Created trace state variable $trace_timestamp for target's variable 1."
(gdb)

gdb启动后就可以设断点啊看变量什么的了,设好断点后输入continue继续运行,但就像前面提到的wait for debugger不是wait gdb,所以gdb说continue还不能continue。打开DDMS

有个红色虫子表示停住了,点上面绿色虫子程序就可以继续运行程序了。你也可以先打开DDMS,然后用jdb attach上去来使程序继续下去:

$jdb -attach localhost:8700

然后就可以换由gdb控制,尽情调试了。

 

方法二:针对第二种情况。用脚本启动目标程序,然后马上attach上去。脚本总比人肉输入快,所以有时候可以用这个方法拼一下看是先crash还是先attach上,优点是比较简单。下面是个简单的例子(调的是Adobe reader),注意其中的grep的字符串得看情况而定,现实当中用时可以先把PID打印出来,或者自动判断下是否唯一。

#!/bin/bash

ACTION=android.intent.action.MAIN
COM=com.adobe.reader/com.adobe.reader.AdobeReader

adb root
adb shell am start -a $ACTION -n $COM
PID=`adb shell ps | grep "reader" | awk '{print $2}'`
CMD="adb shell /data/gdbserver :1234 --attach $PID"
echo $CMD
eval $CMD

 

 

版权声明:本文为博主原创文章,只要标明出处即可转载。 举报

相关文章推荐

Android So动态调试之反jdb附加的解决大法

今天国庆的第六天,西安淅淅沥沥小雨下个不停,索性卧在床上不如品一杯西湖龙井,更新一篇博客,一来帮助需要之人;二来加深自己的理解。 问题篇: 在上一篇中讲到了关于Android so的动态调试,没看的可...

Android下双调试器(gdb+jdb)调试应用程序

原文地址:http://blog.csdn.net/ariesjzj/article/details/7402832 Android下的程序大多数用java写的,跑在dalvik里,但中间又夹杂着n...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

反编译与调试APK

0×01前言 这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等已经无法满足...

Android下的JDB调试

原文地址:http://blog.csdn.net/ariesjzj/article/details/7399249   第一步在$HOME/.jdbrc里设断点,如: stop in com....

百度加固后检测反jdb调试apk的小记录

百度检测反jdb调试apk的小记录

jdb 调试android 简介

jdb 包含在jdk,使用jdb 之前需要先配置jdk的环境变量。 jdb 常用于三方apk 无源码动态调试,与其配合的工具为 baksmali、apkanalyser, 通过apkanalyser打...

Android逆向之旅---动态方式破解apk前奏篇(Eclipse动态调试smail源码)

今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了:Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用apktoo...

使用JDB指令模拟Eclipse调试java程序.

使用JDB指令模拟Eclipse调试java程序.最近一段时间在研究JVM虚拟机, 大致明白了其运作过程。研究完毕后, 向上走, 便在想是如何实现程序调试功能的,刚好查看到JDB工具.JDB(Java...

Android下的JDB调试

http://blog.csdn.net/jinzhuojun/article/details/7399249 第一步在$HOME/.jdbrc里设断点,如: stop in com.almale...

Android调试工具adb的使用详解

点击打开链接 Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的。        ADB概述     ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)