MFC程序有错误,用debug调试说事filecore.cpp,但是看不懂啊,求大侠们帮忙

never_give_up 2013-01-24 10:37:53
这是filecore.cpp文件
ULONGLONG CFile::GetPosition() const
{
ASSERT_VALID(this);
ASSERT(m_hFile != INVALID_HANDLE_VALUE);

LARGE_INTEGER liPos;
liPos.QuadPart = 0;
liPos.LowPart = ::SetFilePointer(m_hFile, liPos.LowPart,
#ifndef _WIN32_WCE
&liPos.HighPart,
#else // !_WIN32_WCE
NULL,
#endif // !_WIN32_WCE
FILE_CURRENT);
if (liPos.LowPart == (DWORD)-1) //这应该是第340行
if (::GetLastError() != NO_ERROR)
CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);

return liPos.QuadPart;
}

下面是windbg调试信息
8. FAULTING_IP:
9. mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]
10. 782b4efa cc int 3

73. FOLLOWUP_IP:
74. mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]
75. 782b4efa cc int 3
76.
77. SYMBOL_STACK_INDEX: 0
78.
79. SYMBOL_NAME: mfc90d!CStdioFile::Close+3a
80.
81. FOLLOWUP_NAME: MachineOwner
82.
83. MODULE_NAME: mfc90d
84.
85. IMAGE_NAME: mfc90d.dll
86.
87. DEBUG_FLR_IMAGE_TIMESTAMP: 488f15c6
88.
89. PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT
90.
91. BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT
92.
93. STACK_COMMAND: ~0s ; kb
94.
95. FAILURE_BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3a
96.
97. BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3a
98.
99. Followup: MachineOwner
100. -

...全文
1494 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2013-01-28
  • 打赏
  • 举报
回复
“mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]” 打开“filetxt.cpp”看看错误 是 那句。 把 断点 设 到 那里 试试。
never_give_up 2013-01-28
  • 打赏
  • 举报
回复
引用 15 楼 tiger9991 的回复:
崩溃点重试然后看黄色指针指向哪个语句出错。断点都没学会怎么写代码? 另外看样子,本人怀疑文件打开了处理后没关闭。再打开就出错。
断点我会啊,这个程序的错误没有外在表现,只是一段时间后就没有数据了,我在想是不是获取数据的时候的问题,这个程序在win7和windows 2008 server上基本上没什么问题,但是到windows 2003 Server上就不行了一段时间后就没数据,在server上运行的还是release版本的
never_give_up 2013-01-28
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
不能不停到 断点 ?
真的没有停,我这个程序的错误不是那么明显的,除了一段时间后数据发不出来没有任何外在表现
never_give_up 2013-01-28
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
不能不停到 断点 ?
这个错误不是那么明显,我在服务器上用的是release版本的,debug版本的再我电脑上运行没有问题,跑了一天也没有任何错误,只有早windows 2003 Server上才会出现这种错误,我现在怀疑是不是我获取信息的函数出现的错误,可是其余的地方就没有打开文件的了
never_give_up 2013-01-28
  • 打赏
  • 举报
回复
引用 15 楼 tiger9991 的回复:
崩溃点重试然后看黄色指针指向哪个语句出错。断点都没学会怎么写代码? 另外看样子,本人怀疑文件打开了处理后没关闭。再打开就出错。
我发现如果数据正常发送期间我把网线拔掉的话等我再插上也会不再往外发送数据,这是什么原因呢?是我新开的线程挂起了吗?正常我的线程函数里就是如果发送失败就从新连接,直到连接成功为止,这是因为什么呢?
看不见的裂痕 2013-01-25
  • 打赏
  • 举报
回复
崩溃点重试然后看黄色指针指向哪个语句出错。断点都没学会怎么写代码? 另外看样子,本人怀疑文件打开了处理后没关闭。再打开就出错。
schlafenhamster 2013-01-25
  • 打赏
  • 举报
回复
不能不停到 断点 ?
never_give_up 2013-01-25
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
断点不要去掉,继续运行 (F5)。 看 不能不停到 断点。
而且我这个程序在Win7下运行一切正常啊,就是换到2003 Server环境下一段时间后发不出数据,其余的没有任何外在表现啊,这个错误只是使用windbg调试的时候有这个问题,那这是这个问题比较隐含吗?还是windbg我使用的有问题呢
never_give_up 2013-01-25
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
断点不要去掉,继续运行 (F5)。 看 不能不停到 断点。
那我试试,应该不会吧,因为那个断点的地方只在OnInitDialog里调用的,那我跑一下这个程序
jimette 2013-01-24
  • 打赏
  • 举报
回复
看源代码!!!!
never_give_up 2013-01-24
  • 打赏
  • 举报
回复
引用 2 楼 ouyh12345 的回复:
查看调用堆栈
FAULTING_IP: mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340] 77e24efa cc int 3 EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77e24efa (mfc90d!CStdioFile::Close+0x0000003a) ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 3 Parameter[0]: 00000000 Parameter[1]: 87ed4d48 Parameter[2]: 002c0780 FAULTING_THREAD: 00001efc DEFAULT_BUCKET_ID: STATUS_BREAKPOINT PROCESS_NAME: NetTrafficButton.exe ERROR_CODE: (NTSTATUS) 0x80000003 - { NTGLOBALFLAG: c70 APPLICATION_VERIFIER_FLAGS: 0 LAST_CONTROL_TRANSFER: from 00431526 to 77e24efa STACK_TEXT: 0012e580 00431526 657cd625 00000000 00000110 mfc90d!CStdioFile::Close+0x3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340] 0012eb5c 77e7d470 0012f428 0012eb94 7726c4e7 NetTrafficButton!CNetTrafficButtonDlg::OnInitDialog+0x4c6 [e:\guoxueqi\windows_agent\nettrafficbuttondlg.cpp @ 230] 0012eb68 7726c4e7 00050c9e 00000110 00070c90 mfc90d!AfxDlgProc+0x40 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 28] 0012eb94 77285855 77e7d430 00050c9e 00000110 USER32!InternalCallWinProc+0x23 0012ec10 772859f3 00000000 77e7d430 00050c9e USER32!UserCallDlgProcCheckWow+0xd6 0012ec58 77277206 00000000 00000110 00070c90 USER32!DefDlgProcWorker+0xa8 0012ec74 7726c4e7 00050c9e 00000110 00070c90 USER32!DefDlgProcA+0x22 0012eca0 7726c5e7 772771e4 00050c9e 00000110 USER32!InternalCallWinProc+0x23 0012ed18 77261b31 00000000 772771e4 00050c9e USER32!UserCallWinProcCheckWow+0x14b 0012ed48 77282bee 772771e4 00050c9e 00000110 USER32!CallWindowProcAorW+0x99 0012ed68 77e3e444 772771e4 00050c9e 00000110 USER32!CallWindowProcA+0x1b 0012ed8c 77e3cb8d 00000110 00070c90 00000000 mfc90d!CWnd::DefWindowProcA+0x34 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1043] 0012eda8 77e7e915 0012f428 0012edc4 77ea3923 mfc90d!CWnd::Default+0x3d [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 274] 0012edcc 77e3fe05 00070c90 00000000 6554bd6f mfc90d!CDialog::HandleInitDialog+0xd5 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 673] 0012ef1c 77e3f592 00000110 00070c90 00000000 mfc90d!CWnd::OnWndMsg+0x835 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2018] 0012ef3c 77e3ca10 00000110 00070c90 00000000 mfc90d!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1755] 0012efb8 77e3cfd6 0012f428 00050c9e 00000110 mfc90d!AfxCallWndProc+0xf0 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 240] 0012efd8 77e3879b 00050c9e 00000110 00070c90 mfc90d!AfxWndProc+0xa6 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 403] 0012f014 7726c4e7 00050c9e 00000110 00070c90 mfc90d!AfxWndProcBase+0x5b [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp @ 441] 0012f040 7726c5e7 77e38740 00050c9e 00000110 USER32!InternalCallWinProc+0x23 0012f0b8 77265294 00000000 77e38740 00050c9e USER32!UserCallWinProcCheckWow+0x14b 0012f0f8 77284f6c 008065c0 00806558 00070c90 USER32!SendMessageWorker+0x4d0 0012f1b4 7728535a 00400000 00050c9e 00000200 USER32!InternalCreateDialog+0xb0d 0012f1d8 77277238 00400000 00491cc8 00000000 USER32!CreateDialogIndirectParamAorW+0x33 0012f1f8 77e7deaf 00400000 00491cc8 00000000 USER32!CreateDialogIndirectParamA+0x1b 0012f2c0 77e7e602 00491cc8 00000000 00400000 mfc90d!CWnd::CreateDlgIndirect+0x25f [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 312] 0012f334 0042fd37 657cc3e1 00000000 00000000 mfc90d!CDialog::DoModal+0x1a2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 576] 0012fe98 77e562b4 00000000 00000000 00000000 NetTrafficButton!CNetTrafficButtonApp::InitInstance+0x87 [e:\guoxueqi\windows_agent\nettrafficbutton.cpp @ 67] 0012febc 004737ca 00400000 00000000 002c2b8c mfc90d!AfxWinMain+0x84 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 37] 0012fed4 004695e8 00400000 00000000 002c2b8c NetTrafficButton!WinMain+0x1a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp @ 34] 0012ff80 0046934f 0012ff94 7736ed6c 7ffd4000 NetTrafficButton!__tmainCRTStartup+0x288 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 578] 0012ff88 7736ed6c 7ffd4000 0012ffd4 7784377b NetTrafficButton!WinMainCRTStartup+0xf [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 403] 0012ff94 7784377b 7ffd4000 77da44a3 00000000 kernel32!BaseThreadInitThunk+0xe 0012ffd4 7784374e 004299f0 7ffd4000 00000000 ntdll!__RtlUserThreadStart+0x70 0012ffec 00000000 004299f0 7ffd4000 00000000 ntdll!_RtlUserThreadStart+0x1b FOLLOWUP_IP: mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340] 77e24efa cc int 3 SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: mfc90d!CStdioFile::Close+3a FOLLOWUP_NAME: MachineOwner MODULE_NAME: mfc90d IMAGE_NAME: mfc90d.dll DEBUG_FLR_IMAGE_TIMESTAMP: 488f15c6 PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT STACK_COMMAND: ~0s ; kb FAILURE_BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3a BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3a Followup: MachineOwner --------- 0:000> !heap NtGlobalFlag enables following debugging aids for new heaps: tail checking free checking validate parameters heap tagging Index Address Name Debugging options enabled 1: 002c0000 Process tail checking free checking validate parameters 2: 00010000 tail checking free checking validate parameters 3: 00600000 tail checking free checking validate parameters 4: 00570000 tail checking free checking validate parameters 5: 00530000 tail checking free checking validate parameters 6: 005b0000 tail checking free checking validate parameters 7: 02210000 tail checking free checking validate parameters 8: 02400000 tail checking free checking validate parameters 9: 02640000 tail checking free checking validate parameters 10: 021e0000 tail checking free checking validate parameters 0:000> ~ . 0 Id: 1d4c.1efc Suspend: 1 Teb: 7ffdf000 Unfrozen 这些算吗
看不见的裂痕 2013-01-24
  • 打赏
  • 举报
回复
用callstack可以查询到那个错误语句。分析那个错误语句吧。 看汇编的话,太累了
never_give_up 2013-01-24
  • 打赏
  • 举报
回复
引用 2 楼 ouyh12345 的回复:
查看调用堆栈
用什么指令查啊,我弄了好久没弄明白啊,windbg也没用过
never_give_up 2013-01-24
  • 打赏
  • 举报
回复
//读取配置文件 CStdioFile file; if(file.Open("config.txt", CFile::modeRead, NULL) != 0) { CString strTemp = ""; int config_num = 0; while(file.ReadString(strTemp)) { if(strTemp != "") { char* str = strTemp.GetBufferSetLength(strTemp.GetLength()); char* p = strtok(strTemp.GetBuffer(), " "); int nCount = 0; while(p) { nCount++; if(nCount == 3) { config[config_num].str_id = p; } else if(nCount == 4) { config[config_num].str_type = p; } p=strtok(NULL, " "); }//while(p) config_num++; } } } file.Close(); CStdioFile file2; if(file2.Open("ip.txt", CFile::modeRead, NULL) != 0) { CString strTemp = ""; int sever_num = 0; while(file2.ReadString(strTemp)) { if(strTemp != "") { char* str = strTemp.GetBufferSetLength(strTemp.GetLength()); char* p = strtok(strTemp.GetBuffer(), " "); int nCount = 0; while(p) { nCount++; if(nCount == 1) { sever_data[sever_num].strIP = p; } else if(nCount == 2) { sever_data[sever_num].strPort = p; } p=strtok(NULL, " "); }//while(p) sever_num++; } } } file2.Close(); 上边是我打开文件的代码 然后是线程函数的代码 DWORD CNetTrafficButtonDlg::ThreadProc(LPVOID lpParameter) { CNetTrafficButtonDlg* pThis = (CNetTrafficButtonDlg*)lpParameter; SOCKADDR_IN addrSrv; // CStdioFile file; CString strIp = ""; CString strTemp = ""; CString strPort = ""; char* str=NULL; char* p=NULL; int nCount = 0; BOOL iResult = FALSE; SOCKET m_socket = NULL; fd_set wset; BOOL bConnect = FALSE; while(1) { //pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 //pThis->m_stdioFile.WriteString("Thread Runing\n"); //AfxMessageBox("while"); strIp = ""; strTemp = ""; strPort = ""; str = NULL; p = NULL; nCount = 0; iResult = FALSE; if(WAIT_OBJECT_0 == WaitForSingleObject(pThis->m_hEvent, 1)) { break; } if(WAIT_OBJECT_0 == WaitForSingleObject(pThis->m_hEvent, INFINITE)) { if(m_socket == NULL) { m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET == m_socket) { closesocket(m_socket); m_socket = NULL; continue; } } //这个训话处理连接问题 while(!bConnect) { //AfxMessageBox("while2"); if(sever_data[nCount].strIP == "" || sever_data[nCount].strPort == "") { nCount = 0; continue; } else { strPort = p; addrSrv.sin_addr.s_addr=inet_addr(sever_data[nCount].strIP.GetBuffer()); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(_ttoi(sever_data[nCount].strPort)); } if(SOCKET_ERROR == connect(m_socket, (sockaddr*)&addrSrv, sizeof(addrSrv))) //这里有问题 { nCount++; //断网时,会一直进入这个函数,然后网络连接正常时会发送最近采集的一次信息 continue; } else { bConnect = TRUE; break; } nCount++; } /*if(pThis->json[0]==0) { continue; }*/ iResult = send(m_socket, pThis->json, (int)strlen(pThis->json), 0); if (iResult == SOCKET_ERROR) { bConnect = FALSE; /* CTime time; time = CTime::GetCurrentTime(); CString strtime = ""; strtime.Format("Send failed%s\n", time); pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 pThis->m_stdioFile.WriteString(strtime);*/ continue; } /*CString strSend=""; strSend.Format("发送成功%d\n",iResult); pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 pThis->m_stdioFile.WriteString(strSend);*/ ResetEvent(pThis->m_hEvent); } } // pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 // pThis->m_stdioFile.WriteString("Thread out"); SetEvent(pThis->m_hEventClosed); return 1l; } 剩下的就是一些获取本地信息的代码了
ouyh12345 2013-01-24
  • 打赏
  • 举报
回复
查看调用堆栈
hzy694358 2013-01-24
  • 打赏
  • 举报
回复
句柄不可用? 贴你的代码,不用贴这个
schlafenhamster 2013-01-24
  • 打赏
  • 举报
回复
断点不要去掉,继续运行 (F5)。 看 不能不停到 断点。
never_give_up 2013-01-24
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
“FAULTING_IP: mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]” 在2处: file.close 设断点 (F9)
下了,一步步走到那也没错啊,就是用windbg调试的时候才显示,两个file的地址都是0x0fe71448,这是不是有问题啊,地址一样,但是这两个file都是在OnInitDialog 里调用的,程序刚开始运行没有错误也,就是过段时间之后不往出发送数据了,然后调试就说那里错了,这是怎么原因呢?
never_give_up 2013-01-24
  • 打赏
  • 举报
回复
引用 7 楼 sha_jinhao 的回复:
看源代码!!!!
DWORD CNetTrafficButtonDlg::ThreadProc(LPVOID lpParameter) { CNetTrafficButtonDlg* pThis = (CNetTrafficButtonDlg*)lpParameter; SOCKADDR_IN addrSrv; // CStdioFile file; CString strIp = ""; CString strTemp = ""; CString strPort = ""; char* str=NULL; char* p=NULL; int nCount = 0; BOOL iResult = FALSE; SOCKET m_socket = NULL; fd_set wset; BOOL bConnect = FALSE; while(1) { //pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 //pThis->m_stdioFile.WriteString("Thread Runing\n"); //AfxMessageBox("while"); strIp = ""; strTemp = ""; strPort = ""; str = NULL; p = NULL; nCount = 0; iResult = FALSE; if(WAIT_OBJECT_0 == WaitForSingleObject(pThis->m_hEvent, 1)) { break; } if(WAIT_OBJECT_0 == WaitForSingleObject(pThis->m_hEvent, INFINITE)) { if(m_socket == NULL) { m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET == m_socket) { closesocket(m_socket); m_socket = NULL; continue; } } //这个训话处理连接问题 while(!bConnect) { //AfxMessageBox("while2"); if(sever_data[nCount].strIP == "" || sever_data[nCount].strPort == "") { nCount = 0; continue; } else { strPort = p; addrSrv.sin_addr.s_addr=inet_addr(sever_data[nCount].strIP.GetBuffer()); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(_ttoi(sever_data[nCount].strPort)); } if(SOCKET_ERROR == connect(m_socket, (sockaddr*)&addrSrv, sizeof(addrSrv))) //这里有问题 { nCount++; //断网时,会一直进入这个函数,然后网络连接正常时会发送最近采集的一次信息 continue; } else { bConnect = TRUE; break; } nCount++; } /*if(pThis->json[0]==0) { continue; }*/ iResult = send(m_socket, pThis->json, (int)strlen(pThis->json), 0); if (iResult == SOCKET_ERROR) { bConnect = FALSE; /* CTime time; time = CTime::GetCurrentTime(); CString strtime = ""; strtime.Format("Send failed%s\n", time); pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 pThis->m_stdioFile.WriteString(strtime);*/ continue; } /*CString strSend=""; strSend.Format("发送成功%d\n",iResult); pThis->m_stdioFile.SeekToEnd();//先定位到文件尾部 pThis->m_stdioFile.WriteString(strSend);*/ ResetEvent(pThis->m_hEvent); } } 这是发送的那个线程函数,帮忙看看有问题不,不胜感激
schlafenhamster 2013-01-24
  • 打赏
  • 举报
回复
“FAULTING_IP: mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]” 在2处: file.close 设断点 (F9)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧