这是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

解决方案 »

  1.   

    //读取配置文件
    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;
    }剩下的就是一些获取本地信息的代码了
      

  2.   


    用什么指令查啊,我弄了好久没弄明白啊,windbg也没用过
      

  3.   

    用callstack可以查询到那个错误语句。分析那个错误语句吧。
    看汇编的话,太累了
      

  4.   


    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
    这些算吗
      

  5.   

    “FAULTING_IP: 
    mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]”在2处:
    file.close 设断点 (F9)
      

  6.   


    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);
    }
    }这是发送的那个线程函数,帮忙看看有问题不,不胜感激
      

  7.   


    下了,一步步走到那也没错啊,就是用windbg调试的时候才显示,两个file的地址都是0x0fe71448,这是不是有问题啊,地址一样,但是这两个file都是在OnInitDialog 里调用的,程序刚开始运行没有错误也,就是过段时间之后不往出发送数据了,然后调试就说那里错了,这是怎么原因呢?
      

  8.   


    那我试试,应该不会吧,因为那个断点的地方只在OnInitDialog里调用的,那我跑一下这个程序
      

  9.   


    而且我这个程序在Win7下运行一切正常啊,就是换到2003 Server环境下一段时间后发不出数据,其余的没有任何外在表现啊,这个错误只是使用windbg调试的时候有这个问题,那这是这个问题比较隐含吗?还是windbg我使用的有问题呢
      

  10.   


    这个错误不是那么明显,我在服务器上用的是release版本的,debug版本的再我电脑上运行没有问题,跑了一天也没有任何错误,只有早windows 2003 Server上才会出现这种错误,我现在怀疑是不是我获取信息的函数出现的错误,可是其余的地方就没有打开文件的了
      

  11.   


    断点我会啊,这个程序的错误没有外在表现,只是一段时间后就没有数据了,我在想是不是获取数据的时候的问题,这个程序在win7和windows 2008 server上基本上没什么问题,但是到windows 2003 Server上就不行了一段时间后就没数据,在server上运行的还是release版本的
      

  12.   

    “mfc90d!CStdioFile::Close+3a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp @ 340]”
    打开“filetxt.cpp”看看错误 是 那句。
    把 断点 设 到 那里 试试。