• tombstone问题分析


    tombstone文件包含了发生问题的进程ID信息

    I/DEBUG ( 241): pid: 244, tid: 244, name: mediaserver >>> /system/bin/mediaserver <<<

    当 tid == pid 时,问题发生在父进程,反之问题发生在子进程,从上面的日志信息可以看出发生问题的进程是mediaserver的子进程。

    Terminated signal 和 fault address 信息

    F/libc ( 244): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 244 (mediaserver)

    这里的信息说明出现进程 Crash 的原因是因为程序产生了段错误的信号,访问了非法的内存空间,而访问的非法地址是 0xdeadbaad。

    信号机制是 Linux 进程间通信的一种重要方式,Linux 信号一方面用于正常的进程间通信和同步,如任务控制(SIGINT, SIGTSTP,SIGKILL, SIGCONT,……);另一方面,它还负责监控系统异常及中断。 当应用程序运行异常时, Linux 内核将产生错误信号并通知当前进程。 当前进程在接收到该错误信号后,可以有三种不同的处理方式。

    (1)忽略该信号。

    (2)捕捉该信号并执行对应的信号处理函数(signal handler)。

    (3)执行该信号的缺省操作(如 SIGSEGV, 其缺省操作是终止进程)。

    当 Linux 应用程序在执行时发生严重错误,一般会导致程序 crash。其中,Linux 专门提供了一类 crash 信号,在程序接收到此类信号时,缺省操作是将 crash 的现场信息记录到 core 文件,然后终止进程。

    crash 信号列表:

    SignalDescription
    SIGSEGV Invalid memory reference.
    SIGBUS Access to an undefined portion of a memory object.
    SIGFPE Arithmetic operation error, like divide by zero.
    SIGILL Illegal instruction, like execute garbage or a privileged instruction
    SIGSYS Bad system call.
    SIGXCPU CPU time limit exceeded.
    SIGXFSZ File size limit exceeded.

    分析tombstone文件

    我们主要关注 backtrace 下面的内容,它保存了发生 crash 时候的函数调用关系,但是需要注意的是它的调用顺序是从下向上执行的(#XX pc -->#00 pc),通过这些函数调用关系,我们就可以大概定位出问题发生的地方,在本次 tombstone 日志中,我们通过

    I/DEBUG   (  241):     #00 pc 00028fa8  /system/lib/libc.so (dlfree+1239)
    I/DEBUG   (  241):     #01 pc 0000f2cb  /system/lib/libc.so (free+10)
    I/DEBUG   (  241):     #02 pc 0000a1cb  /system/lib/libstagefright_foundation.so (_ZN7android7ABufferD2Ev+42)
    I/DEBUG   (  241):     #03 pc 0000a211  /system/lib/libstagefright_foundation.so (_ZN7android7ABufferD0Ev+4)
    I/DEBUG   (  241):     #04 pc 0000d68d  /system/lib/libutils.so (_ZNK7android7RefBase9decStrongEPKv+40)

    可以分析出问题是在调用free函数时发生了指针错误,还可以看出问题发生的原因是libstagefright_foundation.so中释放了两次ABuffer引用,接着就去分析是谁谁释放的AUbffer强指针。

    I/DEBUG   (  241):     #05 pc 0005adfd  /system/lib/libstagefright.so (_ZN7android2spINS_13GraphicBufferEED2Ev+10)
    I/DEBUG   (  241):     #06 pc 0007cd0f  /system/lib/libstagefright.so (_ZN7android14MPEG4Extractor10parseChunkEPxi+634)
    I/DEBUG   (  241):     #07 pc 0007d43d  /system/lib/libstagefright.so (_ZN7android14MPEG4Extractor10parseChunkEPxi+2472)
    I/DEBUG   (  241):     #08 pc 0007e873  /system/lib/libstagefright.so (_ZN7android14MPEG4Extractor12readMetaDataEv+58)

    可以看出来在 libstagefright 动态库中的MPEG4Extractor.cpp 的 parseChunk函数出现的错误。

  • 相关阅读:
    单选、复选框控制表格行高亮 JQuery
    java内存泄露处理的方法
    spring几种Dao支持配置
    遇见你,是我最美丽的意外
    JavaClassLoader的一些热运用
    CSS Sprites 图片整合技术
    关于前端工程师与其他岗位协作的想法
    JAVA断言使用
    dreamover 模板
    javascriptdom学习笔记
  • 原文地址:https://www.cnblogs.com/krislight1105/p/10065363.html
Copyright © 2020-2023  润新知