【问题标题】:program has exited with code -1073610751 (0xc0020001)程序已退出,代码为 -1073610751 (0xc0020001)
【发布时间】:2013-08-07 08:25:51
【问题描述】:

我在编写的 SharpDX 程序中遇到了一个奇怪的错误。

该程序包含一个表单MainForm,它继承自SharpDX.Windows.RenderForm(我正在做Direct3D 9)。我有一些逻辑可以通过调用MainForm.Close() 来杀死程序,并且它运行良好。

但是,当我使用 X 按钮或双击屏幕左上角关闭表单时,程序以代码 -1073610751 (0xc0020001) 结束。

这是一个相对较小的烦恼,因为它只在程序完成时发生,所以它是否因错误退出并不重要,因为它实际上正在完成。

但是,当我在Main() 的最后一行设置断点时,不会发生此错误。如果我这样做了,然后按照我的解释关闭窗口,断点就会被命中,然后继续以代码 0 结束程序。

除了 SharpDX 和一个纯 C DLL 我调用一次性处理一些数据,我没有做混合代码,或任何其他奇怪的东西。

我环顾四周,但这段代码似乎与字符串绑定有关?其他人在做奇怪的混合 C++/CLI 的东西时似乎有这个问题,但我没有做这样的事情。

有什么想法吗?至少关于如何获得有关此错误代码的更简洁信息?

【问题讨论】:

  • 检查此链接...blogs.msdn.com/b/cbrumme/archive/2003/04/15/51318.aspx - 从您的描述看来,可能设置了一些消息处理(或从 COM 到您的程序的其他回调),它回调您的 - 或 SharpDX 的 -托管方法并且没有(及时)清理。如果这些回调在托管运行时关闭后发生,您将收到该错误。如果该理论成立,则在最后一行 出现 放置一个断点以留出时间进行清理。
  • 也许您应该调试代码,如果这是第 3 方 .DLL,也许您需要对手动创建的对象进行 Dispose 的一些代码的调试。到目前为止,您尝试过什么..?
  • @MatthewWatson:我不这么认为,因为正如我所说,我没有使用混合程序集。除非 SharpDX 正在做混合的东西,但这不太可能。
  • 这可能是 SharpDX 本身的问题 - 或者可能是 SharpDX 试图(或失败)清理你在最后一刻没有清理的东西 - 例如,就像@DJKRAZE 所说,你需要Dispose 的东西,或者你需要分离的事件处理程序。我很确定错误代码在所有情况下都是相同的(在这种情况下) - 字符串绑定错误和我链接的错误代码都涉及在运行时开始关闭后从 COM(或非托管代码)调用托管代码下。 SharpDX 确实是纯托管代码,但调用(并被调用)COM。

标签: c# sharpdx


【解决方案1】:

这是一个非常低级的 RPC 错误。这很可能在您的程序中使用,它是 COM 运行的底层协议。有很多候选者,SharpDX 本身使用 COM 互操作层来进行 DirectX 调用。而且 DirectX 本身很可能对您的视频驱动程序进行此类调用。

如果出现关机顺序问题,这也是您期望触发的那种错误代码。就像在 COM 接口发布后使用它一样。干净地关闭程序可能是一个难以解决的问题,尤其是当有很多线程时。在任何 DirectX 应用程序中都有。忽略这样的问题也很容易,即使它是已知的并记录在某人的错误数据库中。因为,正如您所指出的,否则该程序可以正常关闭,而不会出现任何令人讨厌的异常。 RPC 已经阻止它爆炸,您会看到它生成的错误代码。

对于这个问题,您几乎无能为力,这是您没有编写的代码,您永远找不到编写此代码的程序员。如果您在“输出”窗口中看到第一次机会异常通知,那么您可以启用非托管调试器,使用 Debug + Exceptions 并勾选 Win32 异常的 Thrown 复选框,启用 Microsoft 符号服务器,当异常发生时您将获得堆栈跟踪被抛出。请注意,这将包含在本机代码的内部,没有可查看的源代码。但它可以查明导致问题的 DLL。您仍然无法修复该 DLL。我建议更新视频驱动程序,这是最常见的问题来源。这就是你能接受的程度。

【讨论】:

  • 很好的答案。不幸的是,我看不到在输出窗口中记录的第一次机会异常。我也会尝试使用 WinDBG。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2017-06-05
  • 1970-01-01
  • 2018-07-18
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多