最近接手了別人寫的一個軟體,運行環境是XP,外設是一臺溫度測量儀,程式里面含有串口通訊的功能。插上串口,正常通訊時,軟體每次都運行13個小時左右后,就崩潰了,提示應用程式發生例外,未知軟體錯誤 0xc0000094 !!!
當我把串口拔掉后,軟體運行一整天也沒問題,所以我判斷是串口通訊這塊代碼的問題。不多說,先貼原始碼:
//串口通信
LONG CMainFrame::OnCommunication(WPARAM ch, LPARAM port)
{
int j;
//串口1,連接溫度儀
for (j=0; j<4; j++) {
if (port==m_nPorts[j] && m_tyPorts[j]==PORT_TYPE_TEMP) {
if(ch == 10) //得到回車碼,表示傳輸完畢
{
CString str,tstr;
str = m_strPortReceived[j];
m_strPortReceived[j] = "";
str.SetAt(str.GetLength()-1, '\0');
str.TrimLeft();
str.TrimRight();
if(str.Mid(0,2) == "!T") //?W 得到單色的溫度 ?T 得到雙色的溫度
{
str = str.Mid(2);
int i;//i是用來存放獲取的溫度值,一般都為幾千度,溫度值也可能為字母,如EUUU
i = StrToInt(str);
//只有在發出查詢指令后才處理接收到的資料
if (m_nTempQuery[j] > 0) {
m_nTempDetail[j][m_nTempDetailCount[j]-1] = i;
//去掉低于 10 的溫度值
if(i < m_temp_expt_low) return 0;
//得到最大值
if(i>(int)m_fTempVal[j]) m_fTempVal[j]=(float)i;
}
}
}
else
{
m_strPortReceived[j] += (char)ch;
}
break;
}
}
1.懷疑過記憶體泄漏問題,但是觀察過資源管理器中記憶體使用情況,占用記憶體很少且一直很穩定。
2.程式給串口每秒鐘發送請求測量溫度的命令 ?T (這是溫度儀定義的請求指令,后面還有回車符表示發送完畢),回傳是 !TEUUU或者!T1234(其中1234表示溫度值,后面也有回車符,表接收完畢)。
真心求教各位大神,能否看出可疑之處,求幫助!!!
uj5u.com熱心網友回復:
0xC0000094L STATUS_INTEGER_DIVIDE_BY_ZERO 整數除0了DEBUG模式, 例外中開啟 Win32例外, 除錯模式運行, 很容易捕捉到例外, 奔潰時結合除錯堆疊修改解決之
uj5u.com熱心網友回復:
因為是在release模式下運行,這個VC6.0好像找不到DEBUG模式設定,設定斷點也命中不了。不過在它報錯后我點擊了除錯,彈出了提示框確實是整數除0了,但是我沒保存截圖,最后一條記得好像是 mov eda,edx。 請問從我貼出的代碼中能看出可能是哪出錯了嗎?uj5u.com熱心網友回復:
eda 的值是3600,edx為0uj5u.com熱心網友回復:
VC6 的Release版本除錯功能個人感覺太弱了可以先編譯成Debug版本, 但是VC6的例外 要在啟動除錯后才能打開, 那你可以在程式入口如 InitInstance 中設定一個斷點, 除錯運行,等程式停下來后 再在除錯選單中打開例外 再繼續運行
uj5u.com熱心網友回復:
按你提供的資訊, 問題可能就出在接收資料后的處理上, 可以考慮在這一段里搜除號 / , 分析下前后代碼uj5u.com熱心網友回復:
請問陣列溢位的話會報上述錯誤嗎?uj5u.com熱心網友回復:
提示就是除0了, 一切皆有可能uj5u.com熱心網友回復:
使用 debug 版本, 查找 哪里 有 除法 指令 。uj5u.com熱心網友回復:
回傳是 !TEUUU 時 表示什么 溫度 ? 處理結果 會不會 =0 ?uj5u.com熱心網友回復:
打log輸出到檔案看看先~uj5u.com熱心網友回復:
出錯寫dump檔案,再除錯uj5u.com熱心網友回復:
直接編譯器斷點跟蹤除錯,看具體出錯的陳述句位置。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/59547.html
標籤:基礎類
下一篇:單目視覺位姿測量
