【问题标题】:CSocket:: Create throwing exception in my MFC applicationCSocket:: 在我的 MFC 应用程序中创建抛出异常
【发布时间】:2023-03-14 21:00:02
【问题描述】:

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

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

谁能说明导致应用崩溃的具体原因是什么?

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

【问题讨论】:

    标签: c++ mfc pageheap


    【解决方案1】:

    同样的问题让我发疯了,但最后我修复了它并且它正在工作。这是 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 何时释放套接字。

    祝你好运

    【讨论】:

    • 如果不是你在这里发帖,我就不会发现我的问题。我试图让一个旧的 MFC 应用程序作为服务工作,但我不明白为什么我不能在服务中调用 Create() 和 Listen()。我走错了方向,并认为这与网络访问权限有关,但实际上这与 CAsyncSocket 需要一个窗口的事实有关。 Attach() 在服务中仍然不起作用,但至少现在我知道问题出在哪里。我可能会使用 WinSock 编写我自己的 CSocket 实现。谢谢一百万!
    【解决方案2】:

    我想知道这是否是您实际的堆损坏问题,或者您的程序是否由于使用 Pageheap 运行而刚刚达到资源限制。

    我不记得确切的细节,但是 Pageheap 会产生额外的内存开销,以至于您可以比不启用 Pageheap 时更快地耗尽内存。

    运行 500 个线程时,每个线程都有一个 1MB 的堆栈,以及它们在此过程中动态分配的任何内存。

    CAsyncSocket::AttachHandle 如果无法创建窗口,则触发AfxThrowResourceException。由于 Pageheap,您的系统似乎已饱和。

    是否必须运行 500 个线程才能重现问题?也许如果你能把这个数字降低一点,就会有更多的资源可用。

    【讨论】:

    • 是的,页面堆需要更多内存,但我们想要的是堆损坏注入点。如果我们让我们的 appln 在这种加载状态下运行,应用程序就会崩溃。这是另一个崩溃点,如果我们在高端机器(8 核和 4 GB RAM)中运行应用程序 mfc42u!CFixedAlloc::Alloc+5c mfc42u!CString::AllocBuffer +25 mfc42u!CString::CString+3e WP_Communications_Server!CWPGenericService::AddToMessageLog+b9 有什么线索吗?我们被困在这个问题上超过 2 周了。
    • 您是否需要完整的 Pageheap,或者您可以尝试使用 Normal,每个 support.microsoft.com/kb/286470?由于您的堆已损坏,它可能会在任何地方崩溃。你从来没有回答过我的问题——是否有可能在测试期间减少运行的线程数量以节省资源?还是只有在运行 500 个线程时才会出现这种行为?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多