vest在运行某些特定测试时崩溃
本文关键字:测试 崩溃 运行 vest | 更新日期: 2023-09-27 18:14:02
当我在我的解决方案中运行所有测试(大约800个测试)时,一段时间后弹出一个错误窗口,显示vestest .executionengine.x86.exe已停止工作。
我得到的一些问题细节的例子在这里:
Problem signature:
Problem Event Name: CLR20r3
Problem Signature 01: vstest.executionengine.x86.exe
Problem Signature 02: 14.0.23107.0
Problem Signature 03: 559b7b6c
Problem Signature 04: mscorlib
Problem Signature 05: 4.6.1076.0
Problem Signature 06: 56d79fa2
Problem Signature 07: 0
Problem Signature 08: ffffffff
Problem Signature 09: System.StackOverflowException
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1051
Additional Information 1: 5cd2
Additional Information 2: 5cd2742c12da7dd4b1d5bf900186a452
Additional Information 3: 2fe2
Additional Information 4: 2fe276cacf1c00cd7a2aed7b27f5a5f9
Problem signature:
Problem Event Name: APPCRASH
Application Name: vstest.executionengine.x86.exe
Application Version: 14.0.23107.0
Application Timestamp: 559b7b6c
Fault Module Name: clr.dll
Fault Module Version: 4.6.1076.0
Fault Module Timestamp: 56d7a0ff
Exception Code: c00000fd
Exception Offset: 00003567
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1051
Additional Information 1: 0127
Additional Information 2: 01273c850b3b6fc6378d3f666887788e
Additional Information 3: 0786
Additional Information 4: 07866ddaac895bff9a7fa791fcdaa4a7
在VS输出窗口我得到:
------ Run test started ------
The active Test Run was aborted because the execution process exited unexpectedly. To investigate further, enable local crash dumps either at the machine level or for process vstest.executionengine.x86.exe. Go to more details: http://go.microsoft.com/fwlink/?linkid=232477
========== Run test finished: 0 run (0:03:55,0267906) ==========
当我试图启用本地崩溃转储时,我发现没有这样的注册表项,所以我无法做到。
我找到了导致vest .——.exe崩溃的所有测试(22个测试),注释了它们并再次运行所有测试,没有那些"错误"的测试。一切正常
这些测试有什么问题?它们都是过去有效的旧测试。如何定位问题?
根据我的经验,stackoverflowexception通常是由一些永远不会终止的递归方法调用引起的。试着调试这22个测试中的一个,看看递归是否有问题。
在单元测试中有多种方法可以找到StackOverflowException
的原因。
可能最简单的方法是运行您在Visual Studio调试器下确定的22个测试中的一个。为此,在VS Test Explorer的上下文菜单中选择"调试选定的测试"。如果发生异常,VS将中断,您将能够(非常)深入地查看调用堆栈,以准确地找到它在方法调用循环中开始循环的位置。
这个循环可能有合理的原因(如递归方法),也可能有错误。在前一种情况下,可能(在许多其他可能性中)一些层次数据发生了变化,因此单元测试在递归分析层次结构时遇到了限制。
如果你不能在VS调试器中运行单元测试,那么你必须使用Windows任务管理器获得崩溃vstest.executionengine.x86.exe
的内存转储。
为此,您首先等待,直到您在问题中提到的Windows错误报告(WER)窗口弹出。然后以正确的位打开任务管理器-在您的情况下是32位。这意味着如果你有64位操作系统,你必须启动C:'Windows'SysWOW64'taskmgr.exe
。如果您有32位操作系统,您可以在C:'Windows'System32'taskmgr.exe
运行正常操作系统。
然后右键单击vstest.executionengine.x86.exe
进程,选择"创建转储文件"。生成的.dmp文件可以加载到VS或WinDbg中,其中可以使用SOS扩展名分析调用堆栈。
在VS中调试内存转储,你可以在这里了解更多。
关于WinDbg,你必须在这里下载它,设置这里提到的一些初始配置设置,然后使用这里说明的命令列出线程和它们的调用堆栈。
现在你应该很容易找到问题的根源了。