0x73d311c7 指令引用的 0x000004f9 内存 该内存不能为read
对于这样的异常,用什么来捕获
请给具体实现谢谢

解决方案 »

  1.   

    指针越界了吧
    Debug下call stack看函数调用堆栈~
      

  2.   

    直接调试更快些在try块里写可能会出异常的代码
      

  3.   

    __try
    {
    }__except(1)
    { }
    用SEH
      

  4.   

    关键是,在DEBUG下没有一点问题,或许是DEBUG下,没有出现
    然后,在release下就出现。。不知道怎么调试。虽然可以在RELEASE下调试但是,我这个情况有点特殊我把相关代码贴下:
    有个C/S模式的监控系统,服务端对客户端进行监控在客户端:
    CMyApp::InitInstance()
    {
       //省略。。
       pMainFrame = new CMainFrame;
       if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;   m_pMainWnd = pMainFrame;//pMainFrame为CMyApp的成员   pMainFrame->Listen();//在主框架中进行侦听,以便接受服务端的消息   ....
       ....
       return TRUE;
    }CMainFrame::Listen()
    {
       //获取本机IP
        hostent* phost =  gethostbyname("");
        char* localIP = inet_ntoa (*(struct in_addr *)*phost->h_addr_list);
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.S_un.S_addr  = inet_addr(localIP);
        addr.sin_port  = htons(5001);
        //创建套接字
         m_Socket = socket(AF_INET,SOCK_DGRAM,0);
        if (m_Socket == INVALID_SOCKET)
        {
    MessageBox("套接字创建失败!");
            return;
        }

        char* len = "512";
        if (setsockopt(m_Socket,SOL_SOCKET,SO_SNDBUF,len,4)!= 0)
        {
    MessageBox("设置失败!");
            return;
        }
        //绑定套接字
         if (bind(m_Socket,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
        {
    DWORD dwError=::GetLastError();
            return;
        }
        
        WSAAsyncSelect(m_Socket,this->m_hWnd,CM_RECEIVED,FD_READ);
        m_Confirm = TRUE;
        pSendBuf = new char[2048*2048*2];
        pHeader = pSendBuf;
        m_FrameIndex=0;
        count=0;
        m_Received = FALSE;
        m_Counter = 0;  }void CMainFrame::OnReceived()
    {
        char* pData = new char[1024];
        memset(pData,0,1024);
        sockaddr_in addr;
        int factsize =sizeof(sockaddr);
        int ret = recvfrom(m_Socket,pData,1024,0,(sockaddr*)&addr,&factsize);
        if (ret != -1)
        {
     if(ret==3)
        {
         m_ServerIP=inet_ntoa(addr.sin_addr);
         addr1.sin_addr.S_un.S_addr=inet_addr(m_ServerIP);
         m_Received = TRUE;
         GetDeskMAP();
     }
             else if (ret==8)
     {
         m_Received = TRUE;
         m_FrameIndex +=1;
         if (m_FrameIndex<count)
    SendData(m_FrameIndex,mod,bmpsize,count,pSendBuf,addr1);
         else
    GetDeskMAP();

    }
         }     delete []pData;   
    }
    ==================================================附注:在int ret = recvfrom(m_Socket,pData,1024,0,(sockaddr*)&addr,&factsize);
    全部被注释后,如果recvfrom这行,不注释,就有同样的问题。如果注释了,就没有问题====================
      

  5.   

    没看出什么特殊的啊
    生成pdb符号文件后,就可以release调试了
      

  6.   

    不好跟踪到OnRecv()中比如,我在OnRecv中设置一个断点,然后一步一步的跟踪,直到最后。如果我直接F5,就直接弹出错误。。所以,请问下,怎么跟踪
      

  7.   

    有源文件,调试时还是汇编代码?
    没生成pdb符号文件?
      

  8.   


    比如,服务端发消息后,客户顿OnRecv就会收到消息,如果一步步的调试,直到这个函数的最后,也不会出问题如果跟踪到最后,还一步一步的跟踪,就会是汇编。也看太不懂。。call 这出现问题了========================
    如果不想一直处于汇编下,跟踪,按F5就会出现错误
      

  9.   

    还有一点:   我最开始的代码,Listen中代码,我时写在OnCreate中的   因为,WSASelect中要用到hWnd,所以就放在现在的位置了Listen中
    onCreate中,调用WSAselect,hWMD好像还是0
      

  10.   

    又发现了新问题如果我把OnRecv中的代码 全部去掉也一样 会弹出错误