android打开图库程序的时候出现的问题调试


android打开图库程序的时候出现的问题调试:
只要一点击图库应用程序就出现下面的问题
D/Vivante GAL( 961): gcoOS_Construct(460): open failed.
D/Vivante GAL( 961): gcmASSERT at veglInitializeGlobalData(527) in gpu/driver/openGL/egl/source/gc_egl.c
I/DEBUG ( 689): Build fingerprint: 'generic/full_tiger_mb/tiger_mb:2.3.1/GRH78/eng.fanpeng.20120303.205137:eng/test-keys'
I/DEBUG ( 689): pid: 961, tid: 1086 >>> com.cooliris.media <<<
I/DEBUG ( 689): signal 11 (SIGSEGV), fault addr 00000008
I/DEBUG ( 689): r0 0000001c r1 a393f5b4 r2 00000003 r3 00000030
I/DEBUG ( 689): r4 74696e49 r5 0000001b r6 08350400 r7 00000020
I/DEBUG ( 689): r8 00000016 r9 00000000 10 00000052 11 00000053
I/DEBUG ( 689): 12 00000032 13 000000b0 14 500052d0 15 a393f606
I/DEBUG ( 689): 16 a3940f00 17 53d1ba78 18 00007530 19 000000d8
I/DEBUG ( 689): 20 000000d8 21 a393fa60 22 00000000 23 00000000
I/DEBUG ( 689): 24 a393fa60 25 53d1ba6c 26 53ea8128 fp 5150fe60
I/DEBUG ( 689): ip 5000510c sp a393fa1c lr 53e589b0 pc 53e589d8 cpsr 80000010
I/DEBUG ( 689): #00 pc 53e589d8 /system/lib/libGAL.so
I/DEBUG ( 689): #01 lr 53e589b0 /system/lib/libGAL.so
I/DEBUG ( 689):
通过上面看到pc指针可以看到问题处在libGAL.so中。
反汇编libGAL.so
可以看到问题出在这里:
91720 00058968 :
91721 58968: 92ea2e7c stm.w (r18, r19, r20, r21, r22, r23, r24, sl, lr), [sp-]
91722 5896c: 1a000000 nop (mov r0,r0)
91723 58970: 1a000000 nop (mov r0,r0)
91724 58974: 79fe811c ldw sl, [pc+], #284 ; 58a94
91725 58978: 24ef4018 sub sp, sp, #24 ; 0x18
91726 5897c: 08fe801a add sl, pc, sl
91727 58980: 79fb8114 ldw r14, [pc+], #276 ; 58a98
91728 58984: 1a05c000 mov r23, r0
91729 58988: 79fbc110 ldw r15, [pc+], #272 ; 58a9c
91730 5898c: 1a060002 mov r24, r2
91731 58990: 1a04c003 mov r19, r3
91732 58994: 1a048001 mov r18, r1
91733 58998: 59d0800e ldw r2, [sl+],r14
91734 5899c: 3a000003 mov r0, #3 ; 0x3
91735 589a0: 59d0400f ldw r1, [sl+],r15
91736 589a4: 1a00c017 mov r3, r23
91737 589a8: 79ed403c ldw r21, [sp+], #60
91738 589ac: bdfec2b8 b.l 9490 <_init+0xec>
91739 589b0: 79c58000 ldw r22, [r24+]
91740 589b4: 79ed0040 ldw r20, [sp+], #64
91741 589b8: 35b00009 cmpsub.a r22, #9 ; 0x9
91742 589bc: 78ecc00c stw r19, [sp+], #12
91743 589c0: 78ed0014 stw r20, [sp+], #20
91744 589c4: 78ee0008 stw r24, [sp+], #8
91745 589c8: 78ed4010 stw r21, [sp+], #16
91746 589cc: a0000013 beq 58a1c
91747 589d0: 35b0000a cmpsub.a r22, #10 ; 0xa
91748 589d4: a000000a beq 58a00
91749 589d8: 79b80008 ldw r0, [r23+], #8
问题出在
91749 589d8: 79b80008 ldw r0, [r23+], #8
前面说到I/DEBUG ( 689): signal 11 (SIGSEGV), fault addr 00000008
这就说明这里r23的值是0,然后往0+8的地址写入,造成段错误。应该是这个问题。
r23为什么会是0呢?我们看到
91728 58984: 1a05c000 mov r23, r0
也就是说r0是0,为什么呢?这时想到函数传入参数规则,r0-r3是作为参数传进来,其他的参数用栈来传。
这应该是传入的第一个参数是NULL指针导致的问题。打桩
1063 gceSTATUS gcoOS_DeviceControl(
1064 IN gcoOS Os,
1065 IN gctUINT32 IoControlCode,
1066 IN gctPOINTER InputBuffer,
1067 IN gctSIZE_T InputBufferSize,
1068 OUT gctPOINTER OutputBuffer,
1069 IN gctSIZE_T OutputBufferSize
1070 )
1071 {
1072
1073 __android_log_print(ANDROID_LOG_DEBUG, "Tag","22222 111111111111111%d" , Os);
log信息如下:
D/Tag ( 961): veglInitializeGlobalData fanpeng0 0x0
D/Vivante GAL( 961): gcoOS_Construct(460): open failed.
D/Vivante GAL( 961): gcmASSERT at veglInitializeGlobalData(527) in gpu/driver/openGL/egl/source/gc_egl.c
D/Vivante GAL( 961): (verifyStatus == gcvSTATUS_OK)
D/Vivante GAL( 961): gcoOS_DebugBreak(269)
D/Tag ( 961): veglInitializeGlobalData fanpeng1 0x0
D/Tag ( 961): 22222 1111111111111110 看到最后一个数字是0,证实确实是第一个参数是null指针导致后面段错误。

然后继续排查。
继续看log的前面
D/Vivante GAL( 961): gcoOS_Construct(460): open failed.
D/Vivante GAL( 961): gcmASSERT at veglInitializeGlobalData(527) in
前面那个函数作为一个基础函数,肯定有很多地方调用,到底是哪个调用导致失败呢?
通过这两行log我们去打桩看看。
518 void
519 veglInitializeGlobalData(
520 void
521 )
522 {
523 gcmHEADER();
524 __android_log_print(ANDROID_LOG_DEBUG, "Tag","veglInitializeGlobalData fanpeng0 0x%d" , VideoMemoryMap.os);
525
526 /* Construct gcoOS object. */
527 gcmVERIFY_OK(gcoOS_Construct(&VideoMemoryMap, &VideoMemoryMap.os));
528
529 __android_log_print(ANDROID_LOG_DEBUG, "Tag","veglInitializeGlobalData fanpeng1 0x%d" , VideoMemoryMap.os);
上面524和529是加入的调试log信息,进入gcoOS_Construct打桩
437 if (os == NULL)
438 {
439 /* Out of memory. */
440 __android_log_print(ANDROID_LOG_DEBUG, "Tag","gcoOS_Construct fanpeng0 0x%d" , os);
441 return gcvSTATUS_OUT_OF_MEMORY;//发现并没有从这里返回
442 }
443
444 /* Initialize teh gcoOS object. */
445 os->object.type = gcvOBJ_OS;
446
447 /* Save pointer to context. */
448 os->context = Context;
449 os->heap = gcvNULL;
450
451 if (g_Device < 0)
452 {
453 /* Create a handle to the device. */
454 g_Device = open(GAL_DEV, O_RDWR);
455
456 if (g_Device < 0) 458 gcmTRACE(gcvLEVEL_ERROR, 459 "%s(%d): open failed.", //这就是上面的open failed 460 __FUNCTION__, __LINE__); 461 462 os->object.type = gcvOBJ_UNKNOWN;
463 free(os);//这里才是根源问题
464
465 return gcvSTATUS_OUT_OF_RESOURCES;//从这里返回的
466 }
把前面的log贴过来:
D/Tag ( 961): veglInitializeGlobalData fanpeng0 0x0
D/Vivante GAL( 961): gcoOS_Construct(460): open failed.
D/Vivante GAL( 961): gcmASSERT at veglInitializeGlobalData(527) in gpu/driver/openGL/egl/source/gc_egl.c
D/Vivante GAL( 961): (verifyStatus == gcvSTATUS_OK)
D/Vivante GAL( 961): gcoOS_DebugBreak(269)
D/Tag ( 961): veglInitializeGlobalData fanpeng1 0x0
和上面的桩比对一下,问题处在free(os)这里,这里free掉之后,后面又继续引用os,导致问题。
为什么会free呢?看代码是open 失败。GAL_DEV是/dev/graphics/galcore 也就是说这个设备文件打开失败了。想到android的里面很多文件权限的问题,就把这个文件权限改为chmod 777 /dev/graphics/* 然后程序可以继续运行了。
注:因为在c文件里面没法用LOGI之类的函数打log,其实底层也是调用的__android_log_print,就只能用__android_log_print 但是要在相应的文件
前面包含 #include

http://freenix.blogcn.com/articles/android%E6%89%93%E5%BC%80%E5%9B%BE%E5%BA%93%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%97%B6%E5%80%99%E5%87%BA%E7%8E%B0%E7%9A%84%E9%97%AE%E9%A2%98%E8%B0%83%E8%AF%95.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值