在程序開發時,時常會遇到異常報錯的情況。有時因為環境因素,通過調試工具很難在調試時復現故障情況,或者很難在短時間內復現故障情況。隨著工程代碼量的增加,定位程序出錯位置變得更加困難。
在使用基于WINCE平臺的英創系列工控主板進行應用程序開發時,當程序產生異常退出,CE操作系統將通過調試串口打印類似如下錯誤信息。根據這些信息,結合應用程序對應的map文件,就能夠快速定位程序異常的位置,本文將詳細介紹這一方法。
準備工作
以一個簡單的控制臺程序test_exception.exe為例,模擬會產生異常的程序,代碼如下。
#include 'stdafx.h'
#include 'windows.h'
#include 'commctrl.h'
void testErr(char* pbuf, int len)
{
*(pbuf+len) = len;
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char* p = 0;
char buf[10];
for (i=0; i< 10;i++)
{
printf('i=%d\n',i);
testErr(buf, i);
Sleep(1000);
}
printf('test err\n');
Sleep(1000);
testErr(p, 10);
for (;;)
{
printf('.');
Sleep(1000);
}
return 0;
}
這段代碼有個非常明顯的致命錯誤,char* p = 0;實際上是定義的是p的地址為0,之后testErr(p, 10);函數對p地址的操作會造成指針越界,程序將產生異常結束。
設置工程屬性
首先需要設置工程屬性,讓工程編譯時產生MAP文件。
另外還可以選擇添加匯編輸出信息。
這樣我們在重新編譯程序后,就可以在編譯目錄里找到源文件的.map和.cod兩種調試輔助文件。
記錄DEBUG信息
連接英創主板的調試串口至PC主機的串口,打開串口工具(英創主板默認的調試串口參數為115200,8-N-1),以監聽DEBUG口打印信息。
運行test_exception程序,記錄DEBUG口打印的異常信息。
主要記錄出錯的exe(或者dll)名test_exception.exe,PC地址00011024,和RA地址000110bc。
查看map文件
查找PC地址00011024,和RA地址000110bc附近的信息。
對照PC地址能夠知道,testErr函數的地址00011000,這個函數地址偏移00011024-00011000的地方出錯了。
對照RA地址能夠知道,最后一次調用該函數未出錯時的位置,在wmain函數地址偏移000110bc -00011034的地方。
這樣,我們不但知道了是哪個函數出的錯,也知道了在哪里調用出的錯。
查看cod文件
為了進一步確定范圍,打開編譯目錄下對應的cod文件test_exception.cod。
查看testErr函數信息,可以知道,在偏移地址00011024-00011000=00024的地方的匯編,以及出錯的C代碼,為test_exception.cpp第10行的*(pbuf+len) = len;
查看wmain函數信息,可以知道,返回地址000110bc -00011034=00088,最后一次正常調用testErr的地方是在test_exception.cpp第22行。
定位錯誤
這樣稍加分析,我們就可以確定出錯位置了。
最后,可以在代碼附近添加打印或日志log記錄,來驗證異常位置判斷是否正確。
需要例程可以聯系英創工程師。
如果產生異常提示信息的不是用戶程序,而是'coredll.dll',則判定為是驅動出錯,請聯系英創工程師檢查出錯原因。
-
WINDOWS
+關注
關注
3文章
3545瀏覽量
88707 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35342
發布評論請先 登錄
相關推薦
評論