我的应用程序(VC MFC)使用启用了Pageheap的gflags运行,以跟踪页面堆损坏。
现在应用程序崩溃并显示此错误,我无法解释这些行(除了感觉资源的可用性)
任何人都可以了解造成应用程序崩溃的原因究竟是什么?
(info:应用程序是一个多线程的,在多处理器机器上运行大约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 :(得分:5)
同样的问题让我疯了但最后我修好了它并且它正在发挥作用。这是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在上面的情况下工作,那么我想我们需要在这里做Detach来释放套接字。
祝你好运
答案 1 :(得分:0)
我想知道这是否是您实际的堆损坏问题,或者您的程序是否因为使用Pageheap运行而遇到资源限制。
我不记得确切的细节,但是Pageheap会产生额外的内存开销,以至于你可以比没有启用Pageheap的情况更快地耗尽内存。
运行500个线程时,每个线程都有1MB的堆栈,以及他们在此过程中动态分配的任何内存。
CAsyncSocket::AttachHandle
如果无法创建窗口,则触发AfxThrowResourceException
。由于Pageheap,您的系统似乎已经饱和。
您是否必须运行500个线程才能重现问题?也许如果你可以稍微降低这个数量,那么可用的资源会更多。
答案 2 :(得分:0)
我遇到了同样的问题,在尝试了许多事情之后,我注意到了以下CAsyncSocket参考:
创建不是线程安全的。如果要在多线程环境中调用它(该线程可以被不同的线程同时调用),请确保使用互斥锁或其他同步锁来保护每个调用。
添加Mutex同步后,它不再引发异常。