在程序開發(fā)時(shí),時(shí)常會(huì)遇到異常報(bào)錯(cuò)的情況。有時(shí)因?yàn)榄h(huán)境因素,通過調(diào)試工具很難在調(diào)試時(shí)復(fù)現(xiàn)故障情況,或者很難在短時(shí)間內(nèi)復(fù)現(xiàn)故障情況。隨著工程代碼量的增加,定位程序出錯(cuò)位置變得更加困難。
在使用基于WINCE平臺(tái)的英創(chuàng)系列工控主板進(jìn)行應(yīng)用程序開發(fā)時(shí),當(dāng)程序產(chǎn)生異常退出,CE操作系統(tǒng)將通過調(diào)試串口打印類似如下錯(cuò)誤信息。根據(jù)這些信息,結(jié)合應(yīng)用程序?qū)?yīng)的map文件,就能夠快速定位程序異常的位置,本文將詳細(xì)介紹這一方法。
準(zhǔn)備工作
以一個(gè)簡(jiǎn)單的控制臺(tái)程序test_exception.exe為例,模擬會(huì)產(chǎn)生異常的程序,代碼如下。
#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;
}
這段代碼有個(gè)非常明顯的致命錯(cuò)誤,char* p = 0;實(shí)際上是定義的是p的地址為0,之后testErr(p, 10);函數(shù)對(duì)p地址的操作會(huì)造成指針越界,程序?qū)a(chǎn)生異常結(jié)束。
設(shè)置工程屬性
首先需要設(shè)置工程屬性,讓工程編譯時(shí)產(chǎn)生MAP文件。
另外還可以選擇添加匯編輸出信息。
這樣我們?cè)谥匦戮幾g程序后,就可以在編譯目錄里找到源文件的.map和.cod兩種調(diào)試輔助文件。
記錄DEBUG信息
連接英創(chuàng)主板的調(diào)試串口至PC主機(jī)的串口,打開串口工具(英創(chuàng)主板默認(rèn)的調(diào)試串口參數(shù)為115200,8-N-1),以監(jiān)聽DEBUG口打印信息。
運(yùn)行test_exception程序,記錄DEBUG口打印的異常信息。
主要記錄出錯(cuò)的exe(或者dll)名test_exception.exe,PC地址00011024,和RA地址000110bc。
查看map文件
查找PC地址00011024,和RA地址000110bc附近的信息。
對(duì)照PC地址能夠知道,testErr函數(shù)的地址00011000,這個(gè)函數(shù)地址偏移00011024-00011000的地方出錯(cuò)了。
對(duì)照RA地址能夠知道,最后一次調(diào)用該函數(shù)未出錯(cuò)時(shí)的位置,在wmain函數(shù)地址偏移000110bc -00011034的地方。
這樣,我們不但知道了是哪個(gè)函數(shù)出的錯(cuò),也知道了在哪里調(diào)用出的錯(cuò)。
查看cod文件
為了進(jìn)一步確定范圍,打開編譯目錄下對(duì)應(yīng)的cod文件test_exception.cod。
查看testErr函數(shù)信息,可以知道,在偏移地址00011024-00011000=00024的地方的匯編,以及出錯(cuò)的C代碼,為test_exception.cpp第10行的*(pbuf+len) = len;
查看wmain函數(shù)信息,可以知道,返回地址000110bc -00011034=00088,最后一次正常調(diào)用testErr的地方是在test_exception.cpp第22行。
定位錯(cuò)誤
這樣稍加分析,我們就可以確定出錯(cuò)位置了。
最后,可以在代碼附近添加打印或日志log記錄,來驗(yàn)證異常位置判斷是否正確。
需要例程可以聯(lián)系英創(chuàng)工程師。
如果產(chǎn)生異常提示信息的不是用戶程序,而是'coredll.dll',則判定為是驅(qū)動(dòng)出錯(cuò),請(qǐng)聯(lián)系英創(chuàng)工程師檢查出錯(cuò)原因。
-
WINDOWS
+關(guān)注
關(guān)注
3文章
3521瀏覽量
88317 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35154
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論