断言失败时打开调试器

18

在使用Visual Studio调试应用程序时,当断言失败时是否有办法中断调试器?以前在调试Windows应用程序时,会出现异常并使调试器暂停,但在Smart Device上,会显示一个断言失败的窗口和堆栈跟踪,但我也想看到变量值等信息。

5个回答

18

我真蠢,解决方法很简单。当窗口弹出时,在调试器中按暂停 :)


3
我想知道是否有自动完成这件事的方法。 - Superbest
1
@Superbest - 有的。请看我的回答。 - Darrel Hoffman
1
在使用Visual Studio调试单元测试时,Debug.Assert失败不会弹出窗口,就好像测试框架已经移除了这个功能。(我使用的是VS 2013 Pro。) - yoyo
如果您没有连接调试器,该怎么办? - WeSam Abdallah

17

我不确定VS 2008,但至少在2010及以后的版本中,您可以前往调试/异常(Ctrl-Alt-E)。点击“添加”按钮,选择“公共语言运行时异常”,并键入:

Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException

点击“确定”按钮。它现在将出现在列表中,在“Thrown”列中确保你选中复选框,这样你就可以在任何断言失败时获得一个中断。

更新: 来自VS 2017的屏幕截图 AssertFailedException


好的提示,但是如果我想在调试单元测试时中断System.Diagnostics.Debug.Assert怎么办? - yoyo
找到了一个解决方案 - 使用[TestInitialize]添加自定义的System.Diagnostics.TraceListener,在Debug.Assert失败时抛出UnitTesting.AssertFailedException。 - yoyo
@yoyo:“如果我想在调试单元测试时中断System.Diagnostics.Debug.Assert怎么办”--根据文档,使用false作为condition参数的值调用该方法将显示一个对话框,提供三个选项:“中止”,“重试”和“忽略”。选择“重试”将在调试器中中断(类似于调用Debugger.Break())。根本不需要涉及异常处理;Assert()方法与异常处理完全无关,并且在调试器中断Assert()涉及完全不同的机制。 - Peter Duniho

6
除了Vinay的解决方案外,您可以通过调用Debugger.Break为特定进程启动调试器。在您的情况下,每当监听器接收到失败消息时都可以这样做。

1

0
对于一个本地单元测试项目(C++),我们可以按照@Darrel Hoffman的答案中的方法进行操作。
转到调试->窗口->异常设置

Debug->Windows->Exception Settings

Win32 Exceptions下添加一个新的异常。

Add a new exception under Win32 Exceptions

输入错误代码0xE3530001,并给出一些描述。

For error code enter 0xE3530001, and give it some description

输入错误代码0xE3530001,并添加一些描述 现在,从测试资源管理器中选择调试,而不是运行

from test explorer, select Debug, instead of Run

或者,即使您选择<不在此列表中的所有Win32异常>,它也可以正常工作。

Alternatively, it will work even if you select All Win32 Exceptions not in this list

Visual Studio现在将在任何本机单元测试断言(Assert::IsTrue, Assert::IsFalse等)失败时中断。
请注意,默认情况下,在Visual Studio的异常设置中启用了对0xc0000420 Assertion failed异常的中断,但是当我们的单元测试断言失败时,它不会导致调试器中断,因此上述步骤是必要的。

by default breaking on Assertion failed exception is enabled in Visual Studio exception settings, however it doesn't cause the debugger to break when our unit test assertion fails, hence the steps above are necessary

附言: @Darrel Hoffman的回答对于C#单元测试已经足够,但是对于原生C++需要一些额外的步骤,因此我的回答可能对那些像我一样为原生用例而偶然发现这个问题的人有所帮助。

参考资料:

  1. https://unparalleledadventure.com/2019/02/05/the-one-where-we-reverse-engineered-microsofts-c-unit-test-framework-part-3-exceptions/
  2. https://dev59.com/w2445IYBdhLWcg3wgqjS#27660893

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接