这是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 373. 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. -mfcfilebug
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 373. 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. -mfcfilebug
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;
}剩下的就是一些获取本地信息的代码了
用什么指令查啊,我弄了好久没弄明白啊,windbg也没用过
看汇编的话,太累了
FAULTING_IP:
mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]
77e24efa cc int 3EXCEPTION_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]: 002c0780FAULTING_THREAD: 00001efcDEFAULT_BUCKET_ID: STATUS_BREAKPOINTPROCESS_NAME: NetTrafficButton.exeERROR_CODE: (NTSTATUS) 0x80000003 - {NTGLOBALFLAG: c70APPLICATION_VERIFIER_FLAGS: 0LAST_CONTROL_TRANSFER: from 00431526 to 77e24efaSTACK_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 3SYMBOL_STACK_INDEX: 0SYMBOL_NAME: mfc90d!CStdioFile::Close+3aFOLLOWUP_NAME: MachineOwnerMODULE_NAME: mfc90dIMAGE_NAME: mfc90d.dllDEBUG_FLR_IMAGE_TIMESTAMP: 488f15c6PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINTBUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINTSTACK_COMMAND: ~0s ; kbFAILURE_BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3aBUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_mfc90d!CStdioFile::Close+3aFollowup: 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
这些算吗
mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]”在2处:
file.close 设断点 (F9)
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);
}
}这是发送的那个线程函数,帮忙看看有问题不,不胜感激
下了,一步步走到那也没错啊,就是用windbg调试的时候才显示,两个file的地址都是0x0fe71448,这是不是有问题啊,地址一样,但是这两个file都是在OnInitDialog 里调用的,程序刚开始运行没有错误也,就是过段时间之后不往出发送数据了,然后调试就说那里错了,这是怎么原因呢?
那我试试,应该不会吧,因为那个断点的地方只在OnInitDialog里调用的,那我跑一下这个程序
而且我这个程序在Win7下运行一切正常啊,就是换到2003 Server环境下一段时间后发不出数据,其余的没有任何外在表现啊,这个错误只是使用windbg调试的时候有这个问题,那这是这个问题比较隐含吗?还是windbg我使用的有问题呢
这个错误不是那么明显,我在服务器上用的是release版本的,debug版本的再我电脑上运行没有问题,跑了一天也没有任何错误,只有早windows 2003 Server上才会出现这种错误,我现在怀疑是不是我获取信息的函数出现的错误,可是其余的地方就没有打开文件的了
断点我会啊,这个程序的错误没有外在表现,只是一段时间后就没有数据了,我在想是不是获取数据的时候的问题,这个程序在win7和windows 2008 server上基本上没什么问题,但是到windows 2003 Server上就不行了一段时间后就没数据,在server上运行的还是release版本的
打开“filetxt.cpp”看看错误 是 那句。
把 断点 设 到 那里 试试。