原地址:http://blog.csdn.net/andyhuabing/article/details/7074979

这两种方法都不是我发明了,都是网上一些高手公共出来的调试方法,无奈找不到出处的地方了,所以就在此总结一下,以方便android下的调试:

简要说明:

android系统中调试Java非常容易,一般遇到错误都在logcat中打印出错时函数的调用关系,
而C库中出错时只看到一些二进制信息,使用gdbserver调试环境搭建又比较复杂。

方法一:
下在介绍一个简单的调试库的方法,当然需要有so库的源代码
举例
a)         错误信息如下,它表示了出错时的函数调用关系(下面调上面的)

I/DEBUG   (  634):          #00  pc 000078e6  /system/lib/libmultiplayerservice.so
I/DEBUG   (  634):          #01  pc 000087bc  /system/lib/libmultiplayerservice.so
I/DEBUG   (  634):          #02  pc 0000e94e  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #03  pc 0000a790  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #04  pc 0000d4b2  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #05  pc 0000d852  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #06  pc 00015ece  /system/lib/libutils.so
I/DEBUG   (  634):          #07  pc 0000153a  /system/lib/libsystem_server.so
I/DEBUG   (  634):          #08  pc 00001756  /system/lib/libsystem_server.so
I/DEBUG   (  634):          #09  pc 0000adb8  /system/lib/libandroid_servers.so
I/DEBUG   (  634):          #10  pc 00011cb4  /system/lib/libdvm.so

b)进入源码中带符号表的so库所在目录
$ cd out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED

这个有个需要注意的地方:

对于可执行程序及动态库,一般在LINKED子目录中是带有符号的库(没有经过符号剥离),如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。

c)用addr2line命令找到地址对应的程序位置,动态库为libmultiplayerservice.so
arm-eabi-addr2line 000078e6 -e libmultiplayerservice.so
结果:,显示出对应的程序文件和行数,如果不是debug版本,可能有一两行偏差
frameworks/base/services/multiplayerservice/PlayerSocket.cpp 421 行

d)注意
arm-eabi_addr2line在prebuild/linux-x86/toolchain/arm-eabi-xxx/bin目录下,
运行build/envsetup.sh后即可直接使用它,同目录下的objdump, nm也是常用调试命令

方法二:

1、首先需要一个重要的脚本文件:

#!/usr/bin/python
# stack symbol parser
import os
import string
import sys

#define android product name
ANDROID_PRODUCT_NAME = 'generic'

ANDROID_WORKSPACE = os.getcwd()+"/"

# addr2line tool path and symbol path
addr2line_tool = ANDROID_WORKSPACE + 'prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line'
symbol_dir = ANDROID_WORKSPACE + 'out/target/product/' + ANDROID_PRODUCT_NAME +'/symbols'
symbol_bin = symbol_dir + '/system/bin/'
symbol_lib = symbol_dir + '/system/lib/'

class ReadLog:
    def __init__(self,filename):
        self.logname = filename
    def parse(self):
        f = file(self.logname,'r')
        lines = f.readlines()
        if lines != []:
            print 'read file ok'
        else:
            print 'read file failed'
        result =[]
        for line in lines:
            if line.find('stack') != -1:
                print 'stop search'
                break
            elif line.find('system') != -1:
                #print 'find one item' + line
                result.append(line)
        return result

class ParseContent:
    def __init__(self,addr,lib):
            self.address = addr # pc address
            self.exename = lib  # executable or shared library
    def addr2line(self):
        cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address
        #print cmd
        stream = os.popen(cmd)
        lines = stream.readlines();
        list = map(string.strip,lines)
        return list
    
inputarg = sys.argv
if len(inputarg) < 2:
    print 'Please input panic log'
    exit()

filename = inputarg[1]
readlog = ReadLog(filename)
inputlist = readlog.parse()

for item in inputlist:
    itemsplit = item.split()
    test = ParseContent(itemsplit[-2],itemsplit[-1])
    list = test.addr2line()
    print "%-30s%s" % (list[1],list[0])

将以上文件保存hy.panic.py

2、相关的死机堆栈信息保存 error.txt

例如:

I/DEBUG   (  634):          #00  pc 000078e6  /system/lib/libmultiplayerservice.so
I/DEBUG   (  634):          #01  pc 000087bc  /system/lib/libmultiplayerservice.so
I/DEBUG   (  634):          #02  pc 0000e94e  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #03  pc 0000a790  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #04  pc 0000d4b2  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #05  pc 0000d852  /system/lib/libsensorservice.so
I/DEBUG   (  634):          #06  pc 00015ece  /system/lib/libutils.so
I/DEBUG   (  634):          #07  pc 0000153a  /system/lib/libsystem_server.so
I/DEBUG   (  634):          #08  pc 00001756  /system/lib/libsystem_server.so
I/DEBUG   (  634):          #09  pc 0000adb8  /system/lib/libandroid_servers.so
I/DEBUG   (  634):          #10  pc 00011cb4  /system/lib/libdvm.so

3、将以上两个文件拷贝到android的编译根路径下面,执行

python hy.panic.py error.txt

方法2使用非常方便,相比于加打印效率大大提高。非常感谢提供脚本的同学。

android 动态库死机调试方法 .的更多相关文章

  1. html5 微信真机调试方法vConsole

    html5 微信真机调试方法 vConsolehttps://blog.csdn.net/weixin_36934930/article/details/79870240

  2. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  3. 真机调试方法- IOS/Android移动设备

    真机调试 调试安卓 方法一 开启手机的USB调试 安装运行项目 使用chrome步骤如下图 打开开发者工具 打开设备管理 选择设备进行debug 方法二: 直接在地址栏输入chrome://inspe ...

  4. android机顶盒真机调试方法

    最近接触电视APP开发,之前对Android开发也不太了解还一直以为不能真机调试.最近静下心来想一想肯定能真机调试的,我是我不知道而已.现在讲述一下真机调试的步骤: 1.进入设置--关于,连续点击版本 ...

  5. Linux 操作系统死机故障处理方法总结

    通常在出现系统崩溃后,大家会担心再次出现故障,但是发现系统各日志中并没有记录到任何死机前后的信息,无法分析故障原因,认为已经无药可救.但是,实际上,Linux 有多种机制来保证发生系统崩溃后,可以获取 ...

  6. 手机升级到iOS10,用Xcode7.3进行真机调试方法

    今天发布的正式版的iOS10,手机果断升级了,结果发现Xcode7.3不能真机调试了,原因是Xcode7.3里面没有iOS10的sdk,下面这个压缩包你可以下载下来放在你的Xcode7.3里面,当然了 ...

  7. Ubuntu死机解决方法汇总

    为什么不建议强制关机 如果长按电源按键强制关机,有可能损坏硬件或者丢失数据,甚至导致磁盘坏道! 其实, 大部分时候的死机是假死, 不是真死... 有时候鼠标还能动呢. 还有一个原因: 对于平时忠贞不二 ...

  8. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  9. WIN10无法进行Android应用开发真机调试解决方案

    在WIN10操作系统进行ANDROID开发真机调试时,遇到的问题主要归纳一下有以下几点: 一.没有打开"USB调试"项.这点不再赘述: 二.没有安装ADB Interface驱动: ...

随机推荐

  1. 【SSO单点系列】开篇

    年底将至,忙碌了好几个月的项目也接近尾声了.在这个项目中,由于要和其他外系统做单点登录(SSO),整合其他系统的功能.在网上查询了相关资料后,最终选取了Yale大学发起的一个开源项目 CAS, 作为项 ...

  2. CSS3过渡效果 兼容IE6、IE7、IE8

    <style> .box{ width:120px;height:40px;background:yellowgreen;line-height:40px;transition:width ...

  3. [AIR] AS3读取本地文件夹中的文件

    import flash.filesystem.File; import flash.net.URLLoader; //var dir:File = File.desktopDirectory; // ...

  4. [译文]casperjs使用说明-使用命令行

    使用命令行 Casperjs使用内置的phantomjs命令行解析器,在cli模块里,它传递参数位置的命名选项 但是不要担心不能熟练操控CLI模块的API,一个casper实例已经包含了cli属性,允 ...

  5. localstorage在safri下的坑

    在ios10.2中的safri浏览器里无痕模式会导致localstorage不能正常使用 具体解决办法如下: if (typeof localStorage === 'object') { try { ...

  6. leetcode-682-Baseball Game

    题目描述: You're now a baseball game point recorder. Given a list of strings, each string can be one of ...

  7. Numpy随机数(一):超几何分布

    超几何分布 产品抽样检查中经常遇到一类实际问题,假定在N件产品中有M件不合格品,即不合格率 . 在产品中随机抽n件做检查,发现k件不合格品的概率为 ,k=0,1,2,...,min{n,M}. Num ...

  8. python全栈开发_day7_字符编码,以及文件的基本读取

    一:字符编码 1)什么是字符编码 将人能识别的字符等高级标识符与计算机所能识别的二进制01进行转化,这之间的交流需要一个媒介,进行两种标识符之间的转化. 字节的存储方式为八个二进制位 2)乱码 存放数 ...

  9. Codeforces - 331B2 权值线段树 区间合并

    题意:题目太玄了我无法用语言精简.. 题目要求的操作1是基于值的,所以用普通线段树基本无法维护(反正我不知道) 换做权值型后十分好做,因为连接处必然是更后面的,这时比较一下位置就好 PS.感觉周赛越来 ...

  10. js 下不同浏览器,new Date转换结果时差

    项目中在android上使用XWalkView作为浏览器,发现在解析时间的时候解析结果和实际结果有时差. android联机调试的截图如下: PC本机调试截图如下: 从android联机调试的截图看, ...