MTK通過TRACE的棧信息尋找BUG原因與解決方法--轉載

前幾天去一個公司幫他們解決BUG。BUG的描述是這樣的,在使用在線QQ時,如果來電話,就會重啓。沒有發現ASSERT信息,只有stack dump信息。起初聽他們描述,感覺像是QQ或者通話的問題。抓了TRACE之後,發現是MED模塊的問題,由於MED主要是一些媒體文件的解碼。由於觀察現象時發現,通話時,還沒有來得及響鈴,就開始重啓,因此可以大概推知是來電振鈴出了問題,具體出在什麼地方,需要查找TRACE信息。從別人那裏獲取的TRACE信息如下:

Trace 1745424 150706 MOD_NIL TRACE_ERROR [1] fatal error (4): Data_abort - MED
Trace 1745424 150706 MOD_NIL TRACE_ERROR Exception type: data abort
Trace 1745424 150706 MOD_NIL TRACE_ERROR software version:
E500_A.1.4
Trace 1745424 150706 MOD_NIL TRACE_ERROR boot mode: normal mode
Trace 1745424 150706 MOD_NIL TRACE_ERROR rtc sec = 16, rtc min = 33, rtc hour = 1
Trace 1745424 150706 MOD_NIL TRACE_ERROR rtc day = 1, rtc mon = 1, rtc wday = 1, rtc year = 9
Trace 1745424 150706 MOD_NIL TRACE_ERROR execution unit: MEDMED
Trace 1745424 150706 MOD_NIL TRACE_ERROR status: 0x00000000
Trace 1745424 150706 MOD_NIL TRACE_ERROR stack pointer: 0x00169380
Trace 1745424 150706 MOD_NIL TRACE_ERROR stack dump:
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x085569C9
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0xA0001BED
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x085569C9
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x085569C9
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x08480FD5
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x0847CE59
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x084DE0EF
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x0866D4D3
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x0845E407
Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x0866D4A1
Trace 1745424 150706 MOD_NIL TRACE_ERROR number of messages in the external queue: 0
Trace 1745424 150706 MOD_NIL TRACE_ERROR messages in the external queue:
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE
Trace 1745424 150706 MOD_NIL TRACE_ERROR     MSG_ID_INVALID_TYPE

觀察TRACE,結合BUG描述,可以大致推知是MED的振鈴問題,具體位置需要看catcher打印的棧信息。有些人遇到這個信息,就蒙了,感覺無從下手,我最早學習MTK時,也是無從下手,總覺得這樣的信息沒有ASSERT直觀,一看就知道哪個文件哪一行出錯。但ASSERT並不總是金牌,有一次遇到一個MEMCPY的ASSERT,調用的地方太多,照樣需要查棧信息來尋找問題。當然寫的代碼,儘量在一些關鍵的地方加上ASSET,這會讓人查找問題更輕鬆一些。當然有了這個信息,我們也可以大概推測出BUG的地方和原因的。要查找這個error的信息,必須要找到該軟件版本對應的sym文件。該sym和BIN文件同步生成,都位於BUILD文件下。該文件儲存了ARM編繹器爲軟件中所有函數生成的地址。而出錯時,MTK會保存當時棧中最近執行的10條指令的地址,我們通過對這些地址的研究,就可以找到出錯的地方。由於sym文件只保存了函數的地址,函數體裏執行的代碼地址沒有列出,而一般打出的錯誤地址不會正好對應某個函數的地址,一般會會偏移N個單位。當然也有例外,我曾遇到一次出錯,有一個地址正好和某函數地址對應。對於出錯信息的地址與函數地址不對應的情況,我推測應該是函數體裏的指令出錯,所以應查找比該出錯指令小且最近的函數。比如上例行“Trace 1745424 150706 MOD_NIL TRACE_ERROR     0x085569C9”,我們在sym文件中不應該查找0x085569C9對應的指令,因爲一般會一個也找不到,我們要查找x085569C或者x085569對就的函數,這時大約可以查到許多函數,找到與該出錯地址最近且比該地址小的地址對應的函數,十個地址大約可以找到十個左右的函數,通過仔細排查,確認以下函數:

med_int_left_size
med_int_sfreeaud_main
aud_tts_play_req_hdlr
med_int_smalloc
med_set_ext_memory_pool
TCC_Task_Shell

如此可以大致確定問題出處和原因了,請教項目負責人,知道aud_tts_play_req_hdlr
是語音王的播放函數,在呼入時,有來電報號,該功能和QQ都是從MED棧上動態分配內存,由於QQ佔用了一部內存,有呼入電話時,語音王分配內存失敗,導到語音解碼故障。問題一下解決

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