【问题标题】:What are the reasons for SEHException in multi threaded DirectX code?多线程 DirectX 代码中 SEHException 的原因是什么?
【发布时间】:2012-10-04 18:09:35
【问题描述】:

我正在处理一个我不熟悉的相当大且复杂的代码库,它使用 DirectWrite 进行文本渲染。我不知道这是否重要,但这是一个 WinRT(Windows 应用商店)应用程序。

该应用是多线程,一些 DirectX 调用是从后台(不是 UI)线程完成的。所有 BeginDrawEndDraw 调用都是从 UI 线程 进行的,并且一些 DrawText 调用是从背景线程。我确保这些调用都没有重叠,并且 DrawText 仅在 BeginDraw 和 EndDraw 对之间调用。

但是,有时我在调用 DrawText 方法时会收到 SEHException。当从 UI 线程 调用它时,它永远不会发生,只有在从 后台 线程调用时才会发生。
这不会发生在每台计算机上。它经常发生在某些人身上,并且根本无法在其他人身上重现。
VS 调试器说的确切消息是这样的:“x.DLL 中发生了 'System.Runtime.InteropServices.SEHException' 类型的第一次机会异常”,它发生在我调用 ID2D1DeviceContext.DrawText() 函数,调试器会在 DrawText 调用时中断 d2d1.h 头文件。

当抛出 SEHException 时,有什么方法可以调试或诊断出了什么问题? (这显然与从后台线程调用 DrawText 函数有关。)
除此之外,是否有任何从后台线程调用 DirectX 函数的一般规则? (我确保使用 D2D1_FACTORY_TYPE_MULTI_THREADED 选项创建 D2D1Factory。)

【问题讨论】:

  • 听起来像是竞争条件。
  • 抛出结构化异常时程序在做什么? (即,堆栈上有什么?正在执行什么函数?是你的代码还是平台代码?)抛出了什么异常? (所有本机异常都使用结构化异常处理进行处理,因此“在某处抛出了 SEH 异常”并不是特别有用。)
  • 我用确切的异常消息和抛出它的位置澄清了这个问题。

标签: c++ windows-8 directx windows-runtime directwrite


【解决方案1】:

SEH 异常只是 Win32 异常:Windows 内部使用的异常机制,与 C++ 异常不同。

所以所有的 SEH 异常都会告诉您“某些 Windows 函数引发了异常”。与任何其他例外一样,发生这种情况的原因有很多。

因此,询问此类异常的“通常原因”是什么是徒劳的。

std::exception 的常见原因是什么?有很多。

【讨论】:

  • 谢谢,这为我阐明了它的含义。那么当抛出 SEHException 时,有什么方法可以调试或诊断到底出了什么问题?而且一般来说,从后台线程调用像 DrawText 这样的 DirectX 函数并不违法,是吗?
  • 我帮不了你。从历史上看,DirectX 有很多多线程限制,但我不知道 D2D 具体是如何处理的。
【解决方案2】:

该问题仅出现在单台计算机上,无法在其他计算机上重现。并且在更新显卡驱动程序后,它也停止在该计算机上,因此可能是一些驱动程序问题(Windows 8 的 Nvidia 驱动程序已经出现了一些问题)。

【讨论】:

    【解决方案3】:

    确保打开 DirectX 调试运行时。在视觉工作室中运行。它具有打印到控制台的非常详细的错误检查。要打开它,请运行 DirectX 控制面板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2022-01-25
      • 2021-09-14
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多