Posted on 2009-04-02 19:10
S.l.e!ep.¢% 閱讀(2131)
評論(4) 編輯 收藏 引用 所屬分類:
WinDbg
內存崩潰的BUG
內存崩潰的BUG (2)
內存崩潰的BUG (3)
連續三天在跟蹤同個問題!!!!!!!!
今天重現了幾次問題,都是下面的原因導致的。
首先要說下IOCP的實現
下面的發送包時的代碼
-------------------------------------------------------------------------
PER_IO_CONTEXT* overlappedEx=new PER_IO_CONTEXT
overlappedEx->IOOperation= WRITE;
overlappedEx->wsabuf.buf= (char *)malloc( nLen );
if( NULL == overlappedEx->wsabuf.buf )
{
delete overlappedEx;
return -1;
}
if(WSASend(m_socket,&(overlappedEx->wsabuf), 0x01, &dwBytes, 0x00, &(overlappedEx->Overlapped), NULL ) == SOCKET_ERROR)
-------------------------------------------------------------------------
下面是完成端口通知時的處理代碼
-------------------------------------------------------------------------
?while (m_bIsRun)
?{
??result = GetQueuedCompletionStatus(m_hCompletionPort,&iosize,&key,&overlapped,INFINITE);
??if ( 0 == key )?
??{
???break;
??}
??if( NULL != overlappedEx )
??{
???if ( WRITE == overlappedEx->IOOperation )
???{???
????delete overlappedEx;
????continue;
???}
}
……
}
-------------------------------------------------------------------------
之后在?????delete overlappedEx; 前面用 OutPutDebugString 打印了調試信息, 發現在?
?delete overlappedEx; 執行后
WSASend 里面還會訪問到? overlappedEx 下面的??Overlapped,結果就在 WSASend 出錯了
overlappedEx 的結構體定義如下:
struct PER_IO_CONTEXT
{
?WSAOVERLAPPED????Overlapped;
?WSABUF????????????????????? wsabuf;
?IO_OPERATION?????????IOOperation;
};
查了下 MSDN? WSASend 函數的說明,無頭緒,明天繼續