【问题标题】:Problems with starting a program + DLL multiple times in Windows XP?在 Windows XP 中多次启动程序 + DLL 的问题?
【发布时间】:2009-04-12 13:11:58
【问题描述】:

我们开发了一个使用 TCP 和 UDP 套接字的网络库。 此 DLL 由 testclient 使用,它在同一台 PC 上多次启动以进行负载测试。

在Windows Vista中,多次启动testclient是没有问题的。 在 Windows XP 中,启动它最多 5 次是没有问题的,但如果我们启动它 6 次或更多,然后关闭一个客户端,它们都会崩溃并带有明显的随机堆栈跟踪。

是的,虽然我们不使用任何进程间代码(仅客户端之间的套接字),但其中一个客户端的终止会导致所有客户端崩溃。

我们的 DLL 使用 MSVC 编译并使用 Boost 和 Crypto++ 库(静态链接)。

知道为什么不同的过程会相互影响吗?

【问题讨论】:

  • 你试过调试关闭客户端关闭吗?如果您单步关闭它,您可能会找到崩溃的确切来源。为什么它会导致其他人崩溃是下一步。

标签: c++ dll crash visual-c++ interprocess


【解决方案1】:

我们需要更多数据来诊断您的问题。但是考虑到关闭一个客户端会使所有客户端崩溃,您需要考虑客户端可以相互影响的所有方式(进程间通信)。无论是隐含的还是明确的。所以我会先看看

  • 当第 6 个客户端关闭时,服务器会做什么。它会发出其他 5 个客户端无法处理的特殊数据包吗?
  • 您是否在文件系统中读取或写入任何内容?
  • 您使用共享内存吗?

但总的来说,我发现在 C++ 中出现看似随机的堆栈跟踪通常是由以下原因之一引起的

  • 数据损坏
  • 线程逻辑中的竞争条件。

【讨论】:

    【解决方案2】:

    一个想法:你有一些错误。

    说真的,如果没有任何信息,就无法知道您的问题是什么。
    当一个进程崩溃时,它通常有一个很好的理由这样做。找出那是什么。 在调试中编译您的 dll 和可执行文件,附加调试器并了解您获得的堆栈跟踪。如果你得到一个无意义的堆栈跟踪,找出原因。

    和很多问题一样,这个问题很可能通过“调试一下”

    来解决

    【讨论】:

    • 特别是尝试在调试器下运行至少两个客户端。当“随机”崩溃发生时,查看当时所有线程正在访问的内存,以及正在执行的代码。和图书馆有关吗?
    • 其实是两次删除一个对象的bug,奇怪的是只有更多的客户端才会出现。谢谢。
    【解决方案3】:

    修改 DLL 或锁定 DLL 可能会导致依赖它的程序崩溃。通常,对 DLL 的更改会被文件系统锁定,但在您的应用程序中,您可能正在做一些不寻常的事情。

    【讨论】:

    • 感谢回复,但程序执行过程中DLL没有被修改
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多