Android Tombstone解决步骤
2013-10-31 10:01
169 查看
这周和同事一起解了个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文件去找线程间的同步问题。。。这里是最纠结的地方,得多看代码找可能的同步问题,然后加锁同步。。。
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文件去找线程间的同步问题。。。这里是最纠结的地方,得多看代码找可能的同步问题,然后加锁同步。。。
相关文章推荐
- Android Tombstone解决步骤
- Android Tombstone解决步骤
- Android Tombstone解决步骤 .
- 用Kotlin语言写一个简单的Android Demo(有详细步骤和各种解决方法)
- 编译用于Android的busybox---步骤,问题和解决
- 64bits Ubuntu下编译Android的步骤,所遇到的问题和解决方法
- Unity3D工程集成到Android工程步骤及问题解决
- cocos2d-x Win7下 跑通android工程步骤 (解决@drawable/icon)
- android图片异步加载解决步骤
- Android shell 没有 cp 命令的解决方法
- android开发中xml修改后对应R.java中找不到相应资源(id等)解决办法
- [AIR Android] ANE Android Java 接口部分引用第三方JAR的解决办法
- Android xxx is not translated in zh解决办法
- [Android]当文字过长Button往下移解决方法
- android开发 java.lang.NoClassDefFoundError 解决办法之一
- Android 在引用Xstream 解析xml 编译报错问题解决办法
- Android Permission Denial: starting Intent {***********}requires null 解决办法
- Android Gradle Build Error:Some file crunching failed, see logs for details解决办法(转载)
- android: 在android studio中使用retrolambda的步骤
- android-sdk-windows安装重命名错误解决方法