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