Android Tombstone解决步骤

http://blog.csdn.net/a254373829/article/details/8295861

这周和同事一起解了个tombstone的bug, 记录下分析的过程,免得以后又忘记。。。
1>log的分析
pid: 122, tid: 14745, name: Binder_2  >>> /system/bin/mediaserver <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058
    eax 00000000  ebx 41bbf784  ecx 00000000  edx 00000009
    esi 450578f0  edi 40378054
    xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
    eip 4088a5c2  ebp 45e15cb8  esp 45e15ca0  flags 00010297


backtrace:
    #00  pc 000085c2  /system/lib/libcameraservice.so (android::CameraHardwareInterface::__set_buffer_count(preview_stream_ops*, int)+34)
    #01  pc 0003b6fa  /system/lib/hw/camera.XXXX.so (android::PreviewThread::allocateGfxPreviewBuffers(int)+154)
    #02  pc 0003ce83  /system/lib/hw/camera.XXXX.so (android::PreviewThread::threadLoop()+1203)
    #03  pc 0001a2bc  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+556)
    #04  pc 0000dda8  /system/lib/libc.so (__thread_entry+248)
    #05  pc 0001b031  /system/lib/libc.so
    #06  pc 00001f2c  /system/lib/libc.so


从log可以看出, 进程遇到了一个空指针,出错地址为00000058.  一般产生tombstone的问题可能是访问已经被释放的数据,也可能是结构体中的某个函数指针为空。从CPU的寄存器可以看出通用寄存器的eax里的数据为0.


2>对发生问题的库文件进行反汇编,来找到出错的代码行。
00008b40 <_ZN7android23CameraHardwareInterface18__set_buffer_countEP18preview_stream_opsi>:
    8b40:       55                      push   %ebp
    8b41:       89 e5                   mov    %esp,%ebp
    8b43:       8d 64 24 e8             lea    -0x18(%esp),%esp
    8b47:       8b 45 08                mov    0x8(%ebp),%eax
    8b4a:       8b 55 0c                mov    0xc(%ebp),%edx
    8b4d:       8b 40 2c                mov    0x2c(%eax),%eax
    8b50:       8b 40 0c                mov    0xc(%eax),%eax
    8b53:       89 54 24 08             mov    %edx,0x8(%esp)
    8b57:       c7 44 24 04 04 00 00    movl   $0x4,0x4(%esp)
    8b5e:       00
    8b5f:       89 04 24                mov    %eax,(%esp)
    8b62:       ff 50 58                call   *0x58(%eax)           <==出错的地方
    8b65:       c9                      leave  
    8b66:       c3                      ret
    8b67:       89 f6                   mov    %esi,%esi
    8b69:       8d bc 27 00 00 00 00    lea    0x0(%edi,%eiz,1),%edi
在从汇编代码反推到对应的C/C++代码。


3> 找到出错的代码后,手动来设置相应的数据结构为空来验证能否产生相同的出错信息
4> 最后就是从tombstone的log文件去找线程间的同步问题。。。这里是最纠结的地方,得多看代码找可能的同步问题,然后加锁同步。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值