【问题标题】:How to find source for win32 exception "error creating window handle"如何查找win32异常“创建窗口句柄时出错”的来源
【发布时间】:2013-10-17 11:22:26
【问题描述】:

我正在寻找有关 win32 异常“错误创建窗口句柄”的帮助。 我们的程序(WinForms - C#)有时会抛出这个异常,有时甚至窗口会死机,因此用户必须退出进程才能再次工作。

从有关此问题的许多其他线程中,我知道我应该寻找什么,但由于我们的程序很大,所以不确切地知道在哪里。所以我希望可能有一种方法来限制我必须检查的代码行......是否有任何工具可以帮助解决这个异常?

【问题讨论】:

    标签: c# winforms winapi window-handles


    【解决方案1】:

    简短的更新:我解决了这个问题。

    ProcDump 对我帮助不大,因为我从我们的日志文件中获得了几乎相同的信息。但是,我能够在我们的开发环境中重现该错误。感谢调试器并在任务管理器中显示用户对象计数,我找到了内存泄漏的来源 - 一个动态创建的未处理的 texbox。

    再次感谢您的提示!

    【讨论】:

      【解决方案2】:

      如果此问题发生在调试器内部,您可以设置调试器(我假设您使用 C# 时使用 Visual Studio?)在抛出异常时中断。在您的情况下,您希望在(我认为)System.ComponentModel.Win32Exception 上设置一个异常断点。

      再次假设 Visual Studio 作为您的 IDE,“调试”菜单上有一个“异常...”项。这允许您告诉调试器在 a) 抛出特定异常或 b) 未处理时中断。

      在 Common Language Runtime Exceptions 下,展开 System.ComponentModel,并启用 System.ComponentModel.Win32Exception 的 Thrown 列中的复选框。

      然后照常进行。如果在调试过程中发生异常,它应该会闯入您的程序并让您查看它发生的位置。

      编辑:如果您无法在您的开发机器上重现该问题,请查看您是否能够设置目标机器以在发生崩溃时生成转储。一种方法是运行ProcDump。使用-e 参数运行它以在发生异常时创建转储。然后你可以在牧场分析这个。

      【讨论】:

      • 您好,感谢您的回答,是的,我正在使用 Visual Studio 2012。但是,我还无法在我们的本地计算机上重现该问题,而且我们没有任何管理员- 在用户机器上安装工作室的权利。但我将继续尝试重现错误 - 这次使用正确配置的调试器。感谢您的提醒,在我所有(绝望的)尝试找到这个来源的过程中,我完全忘记了这个选项......
      • 我添加了一些可能有帮助的信息,关于创建一个小型转储,您可以在以后进行分析。
      • ProcDump 的-e 命令行参数将仅在出现未处理异常的情况下写入小型转储。鉴于大多数 C# 代码的性质,未处理的异常很少见。您可能还想使用-e 1 来获取第一次机会异常的小型转储。请注意,这可能会生成 很多 个小型转储。
      • @IInspectable:好吧,我没有意识到,我不是 C# 人……但至少他们是 mini 转储 :)
      • 嗨,再次感谢。我会试试这个 ProcDump,看看我能不能得到任何有用的信息。不过可能需要一段时间,直到我可以回来报告。
      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2020-06-09
      • 2013-01-30
      • 2013-06-02
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多