定位到程序崩溃的地方,TOMBSTONE
来源:互联网 发布:群排名优化教程 编辑:程序博客网 时间:2024/05/30 12:30
每次遇到TOMBSTONE,在堆栈中都会存了一些相关的信息。
如:
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 6166617b eax 00000028 ebx 41307340 ecx 4137c500 edx 096b8744 esi 09cbf0f0 edi 61666153 xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007b eip 41222a3f ebp 4fe3fcc8 esp 4fe3fbe0 flags 00010202 #00 eip: 0008da3f /system/lib/libdvm.so (_Z15dvmDumpThreadExPK17DebugOutputTargetP6Threadb+0x4f) #01 eip: 0008dec4 /system/lib/libdvm.so (_Z13dvmDumpThreadP6Threadb+0x54) #02 eip: 000a6e8b /system/lib/libdvm.so (dvmHandleStackOverflow+0x18b) #03 eip: 000a704c /system/lib/libdvm.so (_Z15dvmPushJNIFrameP6ThreadPK6Method+0xfc) #04 eip: 0008fcdd /system/lib/libdvm.so (_Z22dvmAttachCurrentThreadPK16JavaVMAttachArgsb+0x22d) #05 eip: 00076239 /system/lib/libdvm.so (_ZL12attachThreadP7_JavaVMPP7_JNIEnvPvb+0xd9) #06 eip: 001cd5ed /system/lib/libwebcore.so (_ZN3WTFL25runThreadWithRegistrationEPv+0x3d) #07 eip: 0000eca2 /system/lib/libc.so (__thread_entry+0x42)stack: #00 4fe3fbe0 61666153 #00 4fe3fbe4 00000000 #00 4fe3fbe8 00000000 #00 4fe3fbec 00000000
大爷的,以前没学过什么C++, JAVA,只知道这里是发生了段错误,在c++中,_Z15dvmDumpThreadExPK17DebugOutputTargetP6Threadb,这些符号表不同于c,它的意思不但跟传进的参数类型有关,而且前面的那些z15什么的我现在也不知道,自己在找规律,方正这些都是死的,从下到上,结果发现后面的数字 0x**,竟然与接下来调用的函数有关,大家来看看:我先吧libdvm.so 进行了反汇编:objdump libdvm.so -d >1 vim 10008fab0 <_Z22dvmAttachCurrentThreadPK16JavaVMAttachArgsb>: 8fab0: 55 push %ebp 8fab1: 89 e5 mov %esp,%ebp 8fab3: 57 push %edi 8fab4: 56 push %esi 8fab5: 53 push %ebx 8fab6: e8 c6 d4 f9 ff call 2cf81 <__x86.get_pc_thunk.bx> 8fabb: 81 c3 85 28 0e 00 add $0xe2885,%ebx 8fac1: 8d 64 24 94 lea -0x6c(%esp),%esp 8fac5: 8b bb b4 fd ff ff mov -0x24c(%ebx),%edi 8facb: 0f b6 45 0c movzbl 0xc(%ebp),%eax 8facf: c7 44 24 04 60 04 00 movl $0x460,0x4(%esp) 8fad6: 00 8fad7: 88 45 d3 mov %al,-0x2d(%ebp) 8fada: c7 04 24 01 00 00 00 movl $0x1,(%esp) 8fae1: 8b 57 14 mov 0x14(%edi),%edx.................... 8fccb: 8b 87 c4 02 00 00 mov 0x2c4(%edi),%eax 8fcd1: 89 34 24 mov %esi,(%esp) 8fcd4: 89 44 24 04 mov %eax,0x4(%esp) 8fcd8: e8 73 72 01 00 call a6f50 <_Z15dvmPushJNIFrameP6ThreadPK6Method>如在这个函数 dvmAttachCurrentThread里面调用子其 dvmPushJNIFrame,相差就是在汇编的call这里,用8fcd8-8fab0+5=0x22d,呵呵,屡次都是这个样子啊。这样的话,就可以很快的找到崩溃的地方了。还有一种方法,这种还是高手的经验告诉我的。就是直接找到库libdvm.so,然后对其进行反汇编,直接去找到0008da3f这个地址就行了。这点我有点想法,不知道是对的不:因为libdvm.so是个动态的库,在makefile中会有个链接这个些程序的位置,然后才生成这些动态库的,虽然在运行时它地址只是相对的,但是这也就能查到我们能需要的地放了。好了就看看这个地址的汇编到底是个啥8da23: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) 8da2a: 00 8da2b: 89 3c 24 mov %edi,(%esp) 8da2e: e8 9d 37 00 00 call 911d0 <dvmAddTrackedAlloc> 8da33: 8b 8b b4 fd ff ff mov -0x24c(%ebx),%ecx 8da39: 8b 81 30 02 00 00 mov 0x230(%ecx),%eax 8da3f: 8b 04 07 mov (%edi,%eax,1),%eax 8da42: 89 8d 48 ff ff ff mov %ecx,-0xb8(%ebp) 8da48: 89 04 24 mov %eax,(%esp) 8da4b: e8 10 30 00 00 call 90a60 <_Z23dvmCreateCstrFromStringPK12StringObject>呵呵,汇编的话,我也只是个半调子水,不管了,硬着头皮看看吧。在别的微博中了解了一下这些调用的规则,和这些寄存器的大概作用,大概可以定位是edi这个地址错了,这个时候就要一步一步往上面走,看看到底是那个变量的地址错了,为什么会发生越界。不过最后我虽然找到是那个变量发生了越界,但是要我看看一步一步跟着看这个为什么会错误,我觉得我之所以是个菜鸟的原因就是想偷点懒了,暂时不想继续弄下去了。如果继续,倒时候再告诉大家啊。
- 定位到程序崩溃的地方,TOMBSTONE
- 程序崩溃的定位
- 简单的定位到程序崩溃地点的方法
- 简单的定位到程序崩溃地点的方法
- 简单的定位到程序崩溃地点的方法
- Tombstone/Crash的log分析和定位
- Linux 程序崩溃后的源码定位
- Windows程序崩溃定位
- 不懂的地方(崩溃)
- Android - Tombstone crash + Android Tombstone/Crash的log分析和定位
- windos程序崩溃定位1
- Windows程序崩溃定位 vs2010
- Android Tombstone/Crash的log分析和定位
- Android Tombstone/Crash的log分析和定位
- Android Tombstone/Crash的log分析和定位
- Android Tombstone/Crash的log分析和定位
- Android Tombstone/Crash的log分析和定位
- Android Tombstone/Crash的log分析和定位
- android布局文件中的单位
- Sumdiv&&http://poj.org/problem?id=1845&&约数和问题
- ant构建代码模板二
- linux memory check commands
- C#连接access ,sqlserver,excel
- 定位到程序崩溃的地方,TOMBSTONE
- 转(C++计算几何函数库 )
- MVC3 项目总结 (转自cnblogs xling)
- nginx+fastcgi+c/c++搭建高性能Web框架
- 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)
- php url函数学习
- 话说,改造不那么easy~~
- AutoCAD2007安装的一些问题(Result=1638)
- SQLServer触发器