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

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