对一个coder来说,记录一些自己所遇到的错误及解决方法是很重要的,写此系列博文,以备后用,也希望对大家有所帮助。
下面是我在调试一个程序是碰到的错误:
错误log:
F/libc ( 7081): @@@ ABORTING: invalid address or address of corrupt block 0x736ab1a8 passed to dlfree
F/libc ( 7081): Fatal signal 11 (SIGSEGV), thread 7130 (UnityMain)
I/DEBUG ( 3309): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 3309): Build fingerprint: 'google/mantaray/manta:4.3/JWR66V/737497:user/release-keys'
I/DEBUG ( 3309): Revision: '8'
I/DEBUG ( 3309): pid: 7081, tid: 7130, name: UnityMain >>> com.jellk.cityrun3d2 <<<
I/DEBUG ( 3309): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
I/DEBUG ( 3309): Abort message: '@@@ ABORTING: invalid address or address of corrupt block 0x736ab1a8 passed to dlfree'
I/DEBUG ( 3309): r0 00000027 r1 71c5e8e0 r2 00000008 r3 deadbaad
I/DEBUG ( 3309): r4 00000000 r5 75969584 r6 40058000 r7 736ab1b0
I/DEBUG ( 3309): r8 72000e10 r9 73ba887c sl 72000e10 fp 00000000
I/DEBUG ( 3309): ip 00000001 sp 75969580 lr 4008cd7b pc 4008a2e4 cpsr 600f0030
I/DEBUG ( 3309): d0 2064657373617064 d1 736572646461206c
I/DEBUG ( 3309): d2 64646120726f2066 d3 20666f2073736572
I/DEBUG ( 3309): d4 612e312d3264336e d5 2f6b6361625f6b70
I/DEBUG ( 3309): d6 622f737465737361 d7 2f617461442f6e69
I/DEBUG ( 3309): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 3309): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 3309): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 3309): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 3309): d16 000000010628d803 d17 0000000000000001
I/DEBUG ( 3309): d18 0000000000000001 d19 fb30000000000000
I/DEBUG ( 3309): d20 fb30000000000025 d21 0000000000000001
I/DEBUG ( 3309): d22 0000000000000061 d23 0000000000000001
I/DEBUG ( 3309): d24 0000000000000000 d25 0000000000000fff
I/DEBUG ( 3309): d26 00000000000000d0 d27 00000000000000d0
I/DEBUG ( 3309): d28 0000007633533000 d29 00000076335330d0
I/DEBUG ( 3309): d30 0000000000000001 d31 0000000000000001
I/DEBUG ( 3309): scr 80000010
I/DEBUG ( 3309):
I/DEBUG ( 3309): backtrace:
I/DEBUG ( 3309): #00 pc 0001e2e4 /system/lib/libc.so
I/DEBUG ( 3309): #01 pc 0001c4cc /system/lib/libc.so (abort+4)
I/DEBUG ( 3309): #02 pc 000121bd /system/lib/libc.so
I/DEBUG ( 3309): #03 pc 00010e75 /system/lib/libc.so (dlfree+1184)
I/DEBUG ( 3309): #04 pc 0000d9c3 /system/lib/libc.so (free+10)
I/DEBUG ( 3309): #05 pc 0015188c <unknown>
I/DEBUG ( 3309): #06 pc 00153138 <unknown>
I/DEBUG ( 3309): #07 pc 00027e1c <unknown>
I/DEBUG ( 3309): #08 pc 0018c634 <unknown>
I/DEBUG ( 3309): #09 pc 0000dd80 /data/app-lib/com.jellk.cityrun3d2-1/libmono.so (mono_jit_init_version+40)
I/DEBUG ( 3309): #10 pc 002c0334 <unknown>
I/DEBUG ( 3309): #11 pc 003b15a8 <unknown>
I/DEBUG ( 3309): #12 pc 003b1a2c <unknown>
I/DEBUG ( 3309): #13 pc 0001dc0c /system/lib/libdvm.so (dvmPlatformInvoke+112)
I/DEBUG ( 3309): #14 pc 0004de6f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
I/DEBUG ( 3309): #15 pc 00027020 /system/lib/libdvm.so
I/DEBUG ( 3309): #16 pc 0002b5d0 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
I/DEBUG ( 3309): #17 pc 0005fe91 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
I/DEBUG ( 3309): #18 pc 0005febb /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
I/DEBUG ( 3309): #19 pc 00054c4f /system/lib/libdvm.so
I/DEBUG ( 3309): #20 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
I/DEBUG ( 3309): #21 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
I/DEBUG ( 3309):
I/DEBUG ( 3309): stack:
I/DEBUG ( 3309): 75969540 77df28b0
I/DEBUG ( 3309): 75969544 00000000
I/DEBUG ( 3309): 75969548 400b4170 /system/lib/libc.so
I/DEBUG ( 3309): 7596954c 71c5e8e0
I/DEBUG ( 3309): 75969550 00000015
I/DEBUG ( 3309): 75969554 4008bd61 /system/lib/libc.so (__sflush+52)
I/DEBUG ( 3309): 75969558 400b4264 /system/lib/libc.so
I/DEBUG ( 3309): 7596955c 400b41c4 /system/lib/libc.so
I/DEBUG ( 3309): 75969560 00000000
I/DEBUG ( 3309): 75969564 4008cd7b /system/lib/libc.so (_fwalk+34)
I/DEBUG ( 3309): 75969568 4008c029 /system/lib/libc.so (_cleanup)
I/DEBUG ( 3309): 7596956c 75969584 [stack:7130]
I/DEBUG ( 3309): 75969570 40058000
I/DEBUG ( 3309): 75969574 736ab1b0
I/DEBUG ( 3309): 75969578 df002777
I/DEBUG ( 3309): 7596957c e3a070ad
I/DEBUG ( 3309): #00 75969580 400b7204
I/DEBUG ( 3309): 75969584 fffffbdf
I/DEBUG ( 3309): 75969588 720aa000
I/DEBUG ( 3309): 7596958c 0000005a
I/DEBUG ( 3309): 75969590 ffffffff
I/DEBUG ( 3309): 75969594 00000000
I/DEBUG ( 3309): 75969598 00000003
I/DEBUG ( 3309): 7596959c 759695c4 [stack:7130]
I/DEBUG ( 3309): 759695a0 400b6ff4
I/DEBUG ( 3309): 759695a4 400884d0 /system/lib/libc.so (__pthread_clone)
I/DEBUG ( 3309): #01 759695a8 00000000
I/DEBUG ( 3309): 759695ac 4007e1c1 /system/lib/libc.so
I/DEBUG ( 3309): #02 759695b0 759699d4 [stack:7130]
I/DEBUG ( 3309): 759695b4 00000055
I/DEBUG ( 3309): 759695b8 759695c4 [stack:7130]
I/DEBUG ( 3309): 759695bc 75969619 [stack:7130]
I/DEBUG ( 3309): 759695c0 759699c3 [stack:7130]
I/DEBUG ( 3309): 759695c4 20404040
I/DEBUG ( 3309): 759695c8 524f4241 /dev/ashmem/dalvik-heap (deleted)
I/DEBUG ( 3309): 759695cc 474e4954 /dev/ashmem/dalvik-heap (deleted)
I/DEBUG ( 3309): 759695d0 6e69203a /system/framework/core.odex
I/DEBUG ( 3309): 759695d4 696c6176 /dev/ashmem/dalvik-mark-stack (deleted)
I/DEBUG ( 3309): 759695d8 64612064 /dev/ashmem/dalvik-mark-stack (deleted)
I/DEBUG ( 3309): 759695dc 73657264 [stack:7097]
I/DEBUG ( 3309): 759695e0 726f2073 /system/lib/libwebcore.so
I/DEBUG ( 3309): 759695e4 64646120 /dev/ashmem/dalvik-mark-stack (deleted)
I/DEBUG ( 3309): 759695e8 73736572 /dev/mali0
I/DEBUG ( 3309): 759695ec 20666f20
I/DEBUG ( 3309): ........ ........
I/DEBUG ( 3309):
I/DEBUG ( 3309): memory near r1:
I/DEBUG ( 3309): 71c5e8c0 00000004 71c61bf0 40b51888 71c61e70
I/DEBUG ( 3309): 71c5e8d0 00000003 00000007 00000004 0000100b
I/DEBUG ( 3309): 71c5e8e0 6d206e49 69616d67 4e4a206e 6e4f5f49
I/DEBUG ( 3309): 71c5e8f0 64616f4c 0000000a 2d202020 78616d20
遇到此问题,我极端纠结,刚开始这么想“既然是libc里面的函数出了问题,那我有什么办法呢?”
最后在网上查看了一下相关问题,看了别人的解决思路,相关链接如下:
http://stackoverflow.com/questions/12246312/fatal-signal-11-and-invalid-heap-address-in-dlfree-error-when-using-glshaderbina
http://stackoverflow.com/questions/19463705/aborting-invalid-heap-address-in-dlfree-addr-0x00000156
看了这些,我可以肯定的是“自己前面的想法是错的,不是libc的问题,是自己的code有问题”,于是就返回去看自己的code(其实是开源项目,很多代码)。
经我调试和一步步排查发现,是自己把strcpy使用错误导致的,这是个很低级的错误,我没有给buf分派足够的空间,直接使用了strcpy(buf, src)。把这个问题改过来之后,此错误就pass了。
最后要说明的是,如果出现上述问题:
第一,肯定是自己code出错。
第二,必须告诉自己,是自己的code出错,不要找借口。
第三,重复第一和第二。
第四,出现这个问题,不一定是strcpy引起的,也许是使用其他函数引起。
第五,strcpy使用错误,有可能引起前面的错误。
第六,欢迎大家拍砖,分享,交流。