2009-07-18 136 views
1

我有我的應用程序(VC MFC)使用啓用了Pageheap的gflags運行來跟蹤頁堆損壞。CSocket ::在我的MFC應用程序中創建拋出異常

現在,應用程序已經崩潰,它顯示了這個錯誤,我無法解釋這些行(除有資源inavailablity的感覺)

任何人都可以扔在究竟是什麼,才造成原因的光應用程序崩潰?

(信息:應用程序是一個多線程的一個約500線程中運行,在一個多 - 處理器的機器)

kernel32!RaiseException+53 
msvcrt!_CxxThrowException+36 
mfc42u!AfxThrowResourceException+19 
mfc42u!AfxRegisterWndClass+ab 
mfc42u!CAsyncSocket::AttachHandle+5c 
mfc42u!CAsyncSocket::Socket+25 
mfc42u!CAsyncSocket::Create+14 

回答

0

我不知道這是否是您的實際堆腐敗問題,或者如果你的程序只投中一作爲使用Pageheap運行的結果,資源限制。

我不記得確切的細節,但Pageheap會導致額外的內存開銷,以至於您可能比沒有啓用Pageheap時更快地耗盡內存。

在運行500個線程的情況下,每個堆棧都有1MB堆棧,以及它們一直動態分配的內存。

CAsyncSocket::AttachHandle觸發器AfxThrowResourceException如果它不能創建一個窗口。看起來您的系統由於Pageheap而飽和。

您是否必須運行500個線程來重現問題?也許如果你能稍微降低這個數字,那麼會有更多的可用資源。

+0

是的頁面堆需要更多的內存,但我們想要的是堆腐敗注入點。 如果我們讓我們的appln在這個加載的條件下運行,那麼應用程序會崩潰。 這裏是另一個崩潰點,它在這個特定位置墜毀的很多實例,只要我們在高端機器上運行應用程序(8核心和4 GB RAM) mfc42u!CFixedAlloc :: Alloc + 5c mfc42u! CString :: AllocBuffer + 25 mfc42u!CString :: CString + 3e WP_Communications_Server!CWPGenericService :: AddToMessageLog + b9 任何線索?我們被困在這個問題超過2周。 – buddingspacer 2009-07-20 11:14:57

+0

您是否需要Full Pageheap,或者您可以使用Normal來嘗試每個http://support.microsoft.com/kb/286470? 由於堆已損壞,它可能會在任何地方崩潰。你從來沒有回答過我的問題 - 在測試過程中是否有機會減少運行的線程以節省資源?或者當你有500個線程運行時,行爲只會上升嗎? – 2009-07-21 07:10:49

4

這同樣的問題推動了我的堅果,但最後我解決了它,它正在工作。這是錯誤與MFC套接字庫,當[比主應用程序線程等]一個線程內,如果我們試圖做類似

CSocket socket; 
socket.Create(); 

它將引發未處理的異常。我發現了一篇文章See What Microsoft says about this

說了一些來自微軟的東西,但那也沒有幫助我。所以這裏有一個解決方法,我找到了,我希望它可以幫助像我這樣受挫的人。

內螺紋,這樣做

CSocket mySock; 
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
mySock.m_hSocket= sockethandle; 

之後沒有調用mySock.Create,因爲它已通過套接字句柄的分配已經創建。我不確定我們是否可以使用mySock.Attach(sockethandle),因爲我還沒有嘗試過。

之後,您可以直接調用Connect等。

當您完成使用套接字時,請勿撥打mySock.Close() - 而是撥打closesocket(mySock.m_hSocket);然後,將釋放套接字對象。如果Attach在上面的情況下工作,那麼我想我們需要在這裏分離時何時釋放套接字。

好運

相關問題