关闭

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

标签: androidshellcrashtoolsadobe脚本
5892人阅读 评论(0) 收藏 举报
分类:

原文地址: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

 

 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android系统调试-程序崩溃调试

Android系统调试-Native 调试Android系统对于Native(C/C++)应用程序的调试手段比单纯的linux系统更为丰富.一般我们调试linux系统的应用程序崩溃问题,都是通过cor...
  • linux_embedded
  • linux_embedded
  • 2017-09-01 14:50
  • 364

Android开发之如何处理APP意外崩溃问题

本文来自互联网,主要介绍一下当APP意外崩溃时我们如何获取到这种异常,请看文章!
  • itluochen
  • itluochen
  • 2016-08-14 16:32
  • 4068

动态库的调试和崩溃的处理方法

主要讲在VS2010中怎么调试动态库,另外讲一下VS2010开发的应用程序崩溃时,怎么定位问题。
  • hiwubihe
  • hiwubihe
  • 2016-06-04 21:31
  • 3302

android 中处理崩溃异常并重启程序

有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决...
  • CYM_LMY
  • CYM_LMY
  • 2014-04-29 11:39
  • 38672

《软件调试的艺术》学习笔记——GDB使用技巧摘要——程序崩溃处理

《软件调试的艺术》学习笔记——GDB使用技巧摘要——程序崩溃处理     1        程序为什么会崩溃 2       &#...
  • echo_eric
  • echo_eric
  • 2015-01-01 07:06
  • 537

《软件调试的艺术》学习笔记——GDB使用技巧摘要(3)——程序崩溃处理

程序为什么会崩溃 内存中的程序布局 当某个错误导致程序突然和异常地停止执行时,程序崩溃。迄今为止最为常见的导致程序崩溃的原因是试图在未经允许的情况下访问一个内存位置。硬件会感知这件事,并执行对操作系...
  • sun378554759
  • sun378554759
  • 2011-02-24 13:18
  • 698

linux偶发性崩溃的程序该怎么调试 coredump gdb

在Unix/Linux系统上,有一种叫做 Core Dump 的文件,非常有用。 Core dump 文件保存了一个进程异常终止之后的调试信息,能够提供给gdb。 我们通过在gdb中加载这...
  • zhu2695
  • zhu2695
  • 2016-05-27 01:01
  • 757

gdb调试命令及程序崩溃时的内核转存core dump

1.gcc -g filename.c -o filename 需要生成带调试信息的文件 2.调试   方式一:gdb filename 调试file可执行文件   方式二:>>gdb    ...
  • u010144805
  • u010144805
  • 2017-11-03 10:09
  • 44

gdb通过core file定位程序崩溃位置

Linux环境下经常遇到某个进程挂掉而找不到原因,我们可以通过生成core file文件加上gdb来定位。   linux下如何产生core file? 我们可以使用ulimit这条命令对co...
  • LIDE261208
  • LIDE261208
  • 2013-10-17 14:13
  • 1604

解决iPhone 模拟器 XCode gdb 查找无法定位程序崩溃

iPhone 模拟器 XCode gdb 查找无法定位程序崩溃是本文介绍的内容,相信大多数iphone开发者都知道在 Executable中设置NSZombieEnable来显示程序崩溃的位置和具体的...
  • hanspy
  • hanspy
  • 2011-09-30 18:31
  • 1409
    个人资料
    • 访问:1077463次
    • 积分:12950
    • 等级:
    • 排名:第1220名
    • 原创:196篇
    • 转载:109篇
    • 译文:1篇
    • 评论:448条
    文章分类
    文章存档