1

我让我的应用程序(VC MFC)在启用 Pageheap 的 gflags 下运行,以跟踪页面堆损坏。

现在应用程序崩溃并显示此错误,我无法解释这些行(除了感觉资源不可用)

任何人都可以阐明导致应用程序崩溃的确切原因是什么?

(信息:应用程序是一个多线程的,大约有 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 
4

3 回答 3

6

同样的问题让我发疯,但最后我修复了它并且它正在工作。这是 MFC 套接字库的错误,当在线程 [主应用程序线程以外] 中时,如果我们尝试执行类似的操作

CSocket socket;
socket.Create();

它会抛出一个未处理的异常。我在上面找到了一篇文章看看微软对此有何评论

微软说了一些话,但这也对我没有帮助。所以这是我找到的一种解决方法,我希望它可以帮助像我这样沮丧的人。

内部线程,执行此操作

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 在上述情况下有效,那么我想我们需要在此处执行 Detach 何时释放套接字。

祝你好运

于 2010-01-28T16:56:14.350 回答
0

I wonder if this is your actual heap corruption issue, or if your program has just hit a resource limitation as a consequence of running with Pageheap.

I can't remember the exact details, but Pageheap incurs extra memory overhead, so much so that you can run out of memory much sooner than you would without Pageheap enabled.

With 500 threads running, you have a 1MB stack for each, plus any memory they've allocated dynamically along the way.

CAsyncSocket::AttachHandle triggers AfxThrowResourceException if it can't create a window. It seems that your system is saturated due to Pageheap.

Do you have to have 500 threads running to reproduce the problem? Maybe if you could lower that count a little, there would be more resources available.

于 2009-07-18T20:46:29.850 回答
0

我遇到了同样的问题,在尝试了很多事情之后,我注意到以下 CAsyncSocket 参考:

Create 不是线程安全的。如果您在多线程环境中调用它,它可以由不同的线程同时调用,请确保使用互斥锁或其他同步锁保护每个调用。

添加 Mutex 同步后,它不再引发异常。

于 2018-06-25T08:32:41.317 回答