2009-07-18 134 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在上面的情况下工作,那么我想我们需要在这里分离时何时释放套接字。

好运

相关问题