10

我在制作的 SharpDX 程序上遇到了一个奇怪的错误。

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

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

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

但是,当我在Main(). 如果我这样做了,然后按照我的解释关闭窗口,断点就会被命中,然后继续以代码 0 结束程序。

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

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

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

4

1 回答 1

9

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

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

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

于 2013-08-07T11:15:34.367 回答