函数的错误应用导致的致命错误(一)——strcpy




        对一个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使用错误,有可能引起前面的错误。

第六,欢迎大家拍砖,分享,交流。






你可能感兴趣的:(函数,应用,fatal,致命错误)