如何使用VS调试器在“第一次机会”期间检查C ++异常对象?

时间:2018-04-10 03:55:25

标签: c++ debugging exception com visual-studio-debugging

我的程序调用了一个我没有源代码的库(Direct2D ID2D1DCRenderTarget::BeginDraw)。当库代码抛出异常时,Visual Studio调试器给了我“第一次机会”。我有抛出对象的定义(它是_com_error)。 我该如何在调试器中检查该对象?

我尝试修改我的代码以捕获异常,但是该库在传播回调用站点之前捕获(并处理?)异常。我尝试在第一次机会异常点调试调试器中的寄存器和内存,但我不太了解VS如何将异常映射到ABI中以真正知道在哪里查找。是否有指向异常对象的特定寄存器?

为什么我要问:我正在试图弄清楚这个异常是否是库的正常操作的一部分,或者它是否表明我如何使用该库的错误。图书馆似乎正在处理出现的任何异常情况,但我不确定它是否只是掩盖了我的错误。在某些情况下[*],它发生在热循环[**]的每次迭代中,因此我关注异常传播的性能影响。我希望_com_error异常对象中的详细信息能够为我提供有关幕后内容的线索。

[*]在某些情况下,选择了高对比度主题。选择“标准”主题时,不会抛出任何异常。

[**]这是一个热门循环,因为它是动画的每一帧。而且,实际上,每帧几次,因为我同时在几个渲染目标上进行动画处理,并且每个目标的BeginDraw调用都会发生异常。

1 个答案:

答案 0 :(得分:2)

throw中列出的地址应该是_com_error对象的地址。如果他打开Microsoft Symbol Server,您应该能够检查_com_error的属性以及它内部保存的IErrorInfo。

示例:

ConsoleApplication1.exe中的0x757708F2抛出异常:Microsoft C ++异常:内存位置为0x00BAFA70的_com_error。

观看窗口:

patches to support internationalized diff

但是,我建议您改为开启sdk图层:

enter image description here

这应该告诉你他的D2D电话是否出现问题,而不是检查可能是故意的错误。