android buserr

错误现象见下面:

出了一个buserr,又是我们熟悉的0xdeadbaad,进程自杀。

这个进程退出了,android还是能正常起来。

问题大家跟踪了很久没有发现原因,最后倒内核版本发现是内核配置了一个宏引起的,CONFIG_ARCH_USES_GETTIMEOFFSET。

该宏是干嘛的呢,就是在gettimeofday获得时间的时候会调用一个arch_gettimeoffset函数,用来获得比一个时间片更小的时间,简单的说就是获得获得更精确的时间。

问题来了,配了这个宏为什么会导致这个音频的进程退出呢?又琢磨了一段时间,经过大胆的尝试,发现当连续两次获得时间,第二次时间比第一次时间小的时候,就会触发这个buserr。

然后就怀疑到gettimeofday的问题了,写了一个小case,发现连续gettimeofday,第二次的时间有时候会比第一次小。

接着把timer中断的频率还改成4ms一次,原先是10ms一次,就不会出现这个问题了。



在V10的板子上发现一个现象,就是当总线频率为40M的时候没有问题,总线频率为45M以上就会有问题。

这个是个关键的发现,从而怀疑到了数据溢出的问题。

见下:


是timer驱动(arch/csky/silan_suv3/timer.c)中的函数csky_timer_offset出错。
    如下图1,当“tcn”大于429496时,“tcn”乘以“1000000 / HZ”会导致结果数值超过unsigned long型的0xffffffff,导致溢出,从而出错。(乘法操作对应于图2反汇编红框部分)





I/AwesomePlayer(  544): track of type 'audio/vorbis' does not publish bitrate
arch/csky/kernel/traps.c(131): Bus Error Trap

CURRENT PROCESS:

COMM=.vorbis.decoder PID=666
TEXT=00008000-00008d8c DATA=00009000-00009184 BSS=00009184-000fa000
USER-STACK=7fd3ec60  KERNEL-STACK=92b494c0

PC: 0x2ab34868
orig_a0: 0x0000016c
PSR: 0x00020140
r0: 0x0000016c  r1: 0x00000027  r2: 0x00000000  r3: 0x00000000
r4: 0x2d23a88c  r5: 0x000007cc    r6: 0x2ab9b000    r7: 0x2ab336b0
r8: 0x00000000  r9: 0x2d23ad58   r10: 0x2b296a0c   r11: 0x00000084
r12 0x00000000  r13: 0xdeadbaad   r15: 0x2ab34860
r16:0x000cfae8   r17: 0x000cfafc   r18: 0x00000001    r19: 0xffffe6b0
r20 0xffffe6b8   r21: 0xffffe6c0   r22: 0x2ab16340    r23: 0x0000008a
r24 0x0000000b   r25: 0x00000001   r26: 0x00000000    r27: 0x00000000
r28 0x2ab8e684   r29: 0x00000000   r30: 0x00000000    r31: 0x2d23af00
hi 0x0000832b     lo: 0x196e9c09

CODE:
2ab34848: d27c3001 7bd10824 e9039263 ea12ffcd
2ab34858: d7810001 7bcd0832 0021ea8d 11013127
2ab34868: 0000dc2d 0827d01c ea8c7bdd d19c001f
2ab34878: 31060826 33007bd9 1000ea39 0000ea17

KERNEL STACK:
92b4df30: 000cfae8 000cfafc 80002b8a 803b2388
92b4df40: 92b4df40 92b4deb8 00000004 2d23af00
92b4df50: 00009184 000fa000 92b4df70 000007cc
92b4df60: 2ab9b000 80002e34 2d23a88c 800009c2
92b4df70: 2ab34868 0000016c 00020140 0000016c
92b4df80: 00000027 00000000 00000000 2d23a88c
92b4df90: 000007cc 2ab9b000 2ab336b0 00000000
92b4dfa0: 2d23ad58 2b296a0c 00000084 00000000
92b4dfb0: deadbaad 2ab34860 000cfae8 000cfafc
92b4dfc0: 00000001 ffffe6b0 ffffe6b8 ffffe6c0
92b4dfd0: 2ab16340 0000008a 0000000b 00000001
92b4dfe0: 00000000 00000000 2ab8e684 00000000
F/SoftVorbis(  544): frameworks/base/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp:272 CHECK_EQ( 0,_vorbarch/csky/kernel/traps.c(131): Bus Error Trap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章