如何在 "first-chance" 期间使用 VS 调试器检查 C++ 异常对象?
How to use VS debugger to inspect a C++ exception object during the "first-chance"?
我的程序调用了一个我没有源代码的库 (Direct2D ID2D1DCRenderTarget::BeginDraw
). Visual Studio debugger gives me a "first-chance" when that library code throws an exception. I have the definition of the thrown object (it's a _com_error
)。 此时我如何在调试器中检查该对象?
我尝试修改我的代码以捕获异常,但库在异常传播回调用站点之前捕获(并处理?)异常。我试着在第一次出现异常时查看调试器中的寄存器和内存,但我对 VS 如何将异常映射到 ABI 的了解还不够,无法真正知道去哪里查找。是否有指向异常对象的特定寄存器?
我问的原因:我想弄清楚这个异常是库正常运行的一部分,还是表明我在使用库时存在错误。该库似乎正在处理出现的任何异常情况,但我不确定它是否只是在掩盖我的错误。在某些情况下[*],它发生在热循环的每次迭代中[**],所以我担心异常传播对性能的影响。我希望 _com_error
异常对象中的详细信息能给我一些线索,让我了解幕后发生的事情。
[*] 某些情况是选择了高对比度主题。选择 "standard" 主题时,不会抛出异常。
[**] 这是一个热循环,因为它是动画的每一帧。而且,实际上,它是每帧几次,因为我同时在几个渲染目标上制作动画,并且异常发生在每个目标的 BeginDraw 调用上。
throw 中列出的地址应该是_com_error 对象的地址。如果他打开 Microsoft 符号服务器,您应该能够检查 _com_error 的属性和它在内部保存的 IErrorInfo。
示例:
在 ConsoleApplication1.exe 中的 0x757708F2 抛出异常:Microsoft C++ 异常:_com_error 在内存位置 0x00BAFA70。
观看 window:
但是,我建议您改为打开 sdk 层:
https://msdn.microsoft.com/en-us/library/windows/desktop/ee794277(v=vs.85).aspx
与检查可能是故意的错误相比,这应该能更好地告诉您他的 D2D 调用是否出了问题。
我的程序调用了一个我没有源代码的库 (Direct2D ID2D1DCRenderTarget::BeginDraw
). Visual Studio debugger gives me a "first-chance" when that library code throws an exception. I have the definition of the thrown object (it's a _com_error
)。 此时我如何在调试器中检查该对象?
我尝试修改我的代码以捕获异常,但库在异常传播回调用站点之前捕获(并处理?)异常。我试着在第一次出现异常时查看调试器中的寄存器和内存,但我对 VS 如何将异常映射到 ABI 的了解还不够,无法真正知道去哪里查找。是否有指向异常对象的特定寄存器?
我问的原因:我想弄清楚这个异常是库正常运行的一部分,还是表明我在使用库时存在错误。该库似乎正在处理出现的任何异常情况,但我不确定它是否只是在掩盖我的错误。在某些情况下[*],它发生在热循环的每次迭代中[**],所以我担心异常传播对性能的影响。我希望 _com_error
异常对象中的详细信息能给我一些线索,让我了解幕后发生的事情。
[*] 某些情况是选择了高对比度主题。选择 "standard" 主题时,不会抛出异常。
[**] 这是一个热循环,因为它是动画的每一帧。而且,实际上,它是每帧几次,因为我同时在几个渲染目标上制作动画,并且异常发生在每个目标的 BeginDraw 调用上。
throw 中列出的地址应该是_com_error 对象的地址。如果他打开 Microsoft 符号服务器,您应该能够检查 _com_error 的属性和它在内部保存的 IErrorInfo。
示例:
在 ConsoleApplication1.exe 中的 0x757708F2 抛出异常:Microsoft C++ 异常:_com_error 在内存位置 0x00BAFA70。
观看 window:
但是,我建议您改为打开 sdk 层:
https://msdn.microsoft.com/en-us/library/windows/desktop/ee794277(v=vs.85).aspx
与检查可能是故意的错误相比,这应该能更好地告诉您他的 D2D 调用是否出了问题。