首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

未处理的错误,读取位置 0x0180a7e6 时发生访问冲突,却没有异常代码

2012-04-07 
未处理的异常,读取位置 0x0180a7e6 时发生访问冲突,却没有错误代码VS2008写的程序(IOCP的AcceptEx的处理过

未处理的异常,读取位置 0x0180a7e6 时发生访问冲突,却没有错误代码
VS2008写的程序(IOCP的AcceptEx的处理过程),多字节编码莫名其妙出现这个问题,我调试运行的时候程序跳出这个对话框,中断后它没有定位到任何错误代码,就提示是否显示反汇编。我点个是吧,然后程序代码框左边显示的都是地址,右边显示的都是问号,这让我怎么查错啊!?一头雾水。所以弱弱地问一句,各位遇到这种问题,就是调试器没有提示错误源代码所在地,或者乱七八糟的的汇编代码时,怎么办呢?

可是当我用Unicode编码时,一切OK,没有异常发生(这个程序原本是在Unicode编码下写的,后来我发现很多地方Unicode不适合,就换成多字节编码了,但是就出现这问题,那我是重写呢,还是重写呢?。)

CPerSocketData *CIOCPServer::AssociateSockToCompletionPort(SOCKET tSocket)
{
VERIFY( tSocket != INVALID_SOCKET );
CPerSocketData *pSockData = new CPerSocketData();
m_ArrSocketData.AddTail(pSockData);
pSockData->m_Socket = tSocket;
CreateIoCompletionPort((HANDLE)tSocket, m_hCompletionPort, (ULONG_PTR)pSockData, 0); 
return pSockData;
}

BOOL CIOCPServer::PostAccept(CPerSocketData *pSockData)
{
VERIFY( pSockData != NULL );

COverLappedEx *pOverLapEx = new COverLappedEx(IO_ACCEPT_TYPE);
m_ArrOverLapEx.AddTail(pOverLapEx); 
DWORDdwRecvBytes;
charszBuf[1] = { 0 };

pSockData->m_AccSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
BOOL bRet = AcceptEx(pSockData->m_Socket, 
pSockData->m_AccSock,
szBuf/*pOverLapEx->m_szBuf*/,
0,
sizeof(sockaddr_in) + 16,
sizeof(sockaddr_in) + 16, 
&dwRecvBytes, 
&pOverLapEx->m_OverLap); 
if (!bRet) {
if (WSAGetLastError() != WSA_IO_PENDING) {
return FALSE;
}
}

return TRUE;
}

...

case IO_ACCEPT_TYPE:
{
if ( pSockData->m_AccSock == INVALID_SOCKET ) 
continue;
AfxMessageBox(_T("Mission success !"));
QueueUserWorkItem(ThreadPoolFunc, pThis, WT_EXECUTELONGFUNCTION);
pThis->AssociateSockToCompletionPort(pSockData->m_AccSock);
pThis->PostAccept(pSockData);

pThis->m_ArrOverLapEx.RemoveAt(pThis->m_ArrOverLapEx.Find(pOverLapEx));
delete pOverLapEx; pOverLapEx = NULL;

break;
}


[解决办法]
>>中断后它没有定位到任何错误代码,就提示是否显示反汇编。我点个是吧,然后程序代码框左边显示的都是地址,右边显示的都是问号,这让我怎么查错啊!?

查看栈回朔,找到工程函数处进去就能看定位到错误代码处了,仔细检测下。

[解决办法]
写日志,判断大约在什么地方崩溃,然后单步跟踪
[解决办法]
用ollydbg调试,出错时看看错误地址和调用堆栈,就能大概确定哪行代码有问题了。

热点排行