在嵌入式系統(tǒng)軟件調(diào)試過程中,偶發(fā)性問題往往是一個(gè)令人頭痛的問題。這些問題的特點(diǎn)是:按一定概率出現(xiàn),具有不確定性。因此,如果不采取一些技巧,往往不容易捕捉到問題現(xiàn)場。因?yàn)閱栴}出現(xiàn)的特點(diǎn)是“稍縱即逝”。找不到問題出現(xiàn)的現(xiàn)場,則無法深入分析問題出現(xiàn)的機(jī)理原因,只能通過猜測問題原因并嘗試修改,然后觀察問題是否再出現(xiàn),如果問題看起來不再出現(xiàn)則認(rèn)為問題解決了,但是對于問題的實(shí)質(zhì)原因,卻難以說出個(gè)究竟來。這種方法雖然可以避免問題,但是無法從根本解決問題,很可能導(dǎo)致問題復(fù)發(fā)。
對付偶發(fā)性問題的基本策略是:
(1)通過問題現(xiàn)象,初步判斷問題的出現(xiàn)點(diǎn)。
?。?)用多種手段,鎖定問題現(xiàn)場。
?。?)用驗(yàn)證的方法放大問題點(diǎn),使之由偶發(fā)性問題變?yōu)楸匕l(fā)問題。
?。?)根據(jù)問題出現(xiàn)機(jī)理,提出解決對策
(5)驗(yàn)證解決對策的可靠性。
下面詳細(xì)介紹三種具體的方法來鎖定偶發(fā)性問題:
(1) 如果對實(shí)時(shí)性不高,那么可以采用文件、串口等記錄手段記錄程序運(yùn)行過程中的各個(gè)狀態(tài)、關(guān)鍵變量的編號,便于發(fā)生問題后跟蹤分析。
(2) 如果實(shí)時(shí)性要求很高,定義若干個(gè)公共數(shù)組變量,用于記錄在程序運(yùn)行過程中各關(guān)鍵變量和現(xiàn)場數(shù)據(jù),增加條件停止的程序,即所謂的陷阱程序。當(dāng)發(fā)生問題后,程序跑到陷阱程序中 可以通過停止運(yùn)行或把公共變量通過串口、屏幕輸出,觀察分析問題原因。
(3) ARM嵌入式系統(tǒng)中,如果程序出現(xiàn)突然復(fù)位或者死機(jī)時(shí),如何找回現(xiàn)場?很簡單,只需要在啟動(dòng)點(diǎn)上再設(shè)一個(gè)斷點(diǎn),當(dāng)程序復(fù)位或死機(jī)時(shí),并停止運(yùn)行時(shí),觀察R13,然后 在內(nèi)存中找到R13所指的程序段,反匯編之(AXD可以反匯編內(nèi)存),就可以大概分析出哪個(gè)函數(shù)出問題。然后追溯到對應(yīng)的C代碼上,在該C代碼之前若干行設(shè)置斷點(diǎn),然后單步運(yùn)行,可以觀察到問題再現(xiàn)。
(4) 用多余的I/O口來跟蹤程序的運(yùn)行狀態(tài),方法是:當(dāng)程序運(yùn)行到某程序段時(shí)某輸出口為高電平,否則為低電平。用示波器觀察輸出口狀態(tài),如果問題出現(xiàn)在高電平,則可以初步判定可能該段程序有問題,可以深入跟蹤之。這在前后臺系統(tǒng)中比較管用,在多任務(wù)系統(tǒng)中, 可以考慮用多引腳組合起來跟蹤。這種方法對于實(shí)時(shí)測量系統(tǒng)中跟蹤程序很好用。
|