我正在处理一个我不熟悉的相当大而复杂的代码库,它使用 DirectWrite 进行文本呈现。我不知道是否重要,但这是一个WinRT(Windows Store)应用程序。
该应用多线程,一些DirectX调用是从后台(非UI)线程完成的。所有 BeginDraw 和 EndDraw 调用均来自 UI线程,而某些 DrawText 调用来自后台主题。我确保这些调用都不重叠,并且只在BeginDraw和EndDraw对之间调用DrawText。
但是,有时在调用DrawText方法时会出现 SEHException 。只有从背景线程调用时才会从 UI线程调用它。 这不会发生在每台计算机上。它经常发生在某些人身上,而在其他人身上根本无法复制 VS Debugger所说的确切消息是:“x.DLL中出现'System.Runtime.InteropServices.SEHException'类型的第一次机会异常”,当我调用 ID2D1DeviceContext.DrawText() function,调试器在DrawText调用的d2d1.h头文件中断。
有什么方法可以调试或诊断抛出SEHException时出错的地方? (它显然与从后台线程调用DrawText函数有关。)
除此之外,是否有任何从后台线程调用DirectX函数的一般规则? (我确保使用D2D1_FACTORY_TYPE_MULTI_THREADED选项创建D2D1Factory。)
答案 0 :(得分:3)
SEH异常只是一个Win32异常:Windows内部使用的异常机制,与C ++异常不同。
因此,所有SEH异常都会告诉您“某些Windows函数引发异常”。与任何其他例外一样,这可能由于很多原因而发生。
因此,询问这种例外的“通常原因”是什么,是徒劳的。
std::exception
的常见原因是什么?有很多。
答案 1 :(得分:0)
问题只发生在一台计算机上,无法在其他计算机上复制。在视频卡驱动程序更新后,它也停止在该计算机上,因此可能存在一些驱动程序问题(Windows 8的Nvidia驱动程序已经存在一些问题)。
答案 2 :(得分:0)
确保打开DirectX调试运行时。在视觉工作室运行。它具有打印到控制台的非常详细的错误检查。要打开它,请运行DirectX控制面板。