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