运行 某些特定测试时 vstest 崩溃
vstest crashed when running some particular tests
当我让 运行 我的解决方案中的所有测试(大约 800 个测试)时,一段时间后弹出 window 错误显示 vstest.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.WhosebugException
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 输出中 window 我得到:
------ 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) ==========
当我尝试启用本地故障转储时,我发现没有这样的注册表项,所以我无法启用。
我找到了导致 vstest.----.exe 崩溃的所有测试(22 个测试),对它们进行了评论,然后 运行 再次测试所有测试,但没有那些 "wrong" 测试。一切 运行 都很好。
这些测试有什么问题?它们都是过去有效的旧测试。如何定位问题?
根据我的经验,WhosebugExeptions 通常是由一些永不终止的递归方法调用引起的。尝试调试这 22 个测试中的一个以查明递归是否是问题所在。
有多种方法可以找到单元测试中 WhosebugException
的原因。
可能最简单的方法是 运行 您在 Visual Studio 调试器下确定的 22 个测试之一。为此,您在 VS 测试资源管理器的上下文菜单中 select "Debug selected tests"。如果发生异常,VS 将中断,您将能够(非常)深入地查看调用堆栈,以准确找到它在方法调用循环中开始循环的位置。
此循环可能有合理的原因(如递归方法)或可能存在错误。在前者的情况下,可能(在许多其他可能性中)一些分层数据发生了变化,因此单元测试现在在递归分析层次结构时达到了极限。
如果您不能 运行 在 VS 调试器中进行单元测试,那么您必须使用 Windows 任务管理器获取崩溃 vstest.executionengine.x86.exe
的内存转储。
为此,您首先要等到您在问题中提到的 Windows 错误报告 (WER) 的 window 弹出。然后以正确的位数打开任务管理器 - 在您的情况下为 32 位。这意味着如果您有 64 位 OS,则必须启动 C:\Windows\SysWOW64\taskmgr.exe
。如果你有一个 32 位 OS 你可以 运行 普通的 C:\Windows\System32\taskmgr.exe
.
然后右键单击 vstest.executionengine.x86.exe
进程并选择 "Create Dump File"。生成的 .dmp 文件可以加载到 VS 或 WinDbg 中,在其中可以使用 SOS 扩展名分析调用堆栈。
要在 VS 中调试内存转储,您可以阅读更多相关内容 here。
关于 WinDbg 你必须下载它 here, set up a few initial configuration settings mentioned here and then list the threads and their call stacks using the commands stated here。
现在您应该很容易找到问题的根本原因。
当我让 运行 我的解决方案中的所有测试(大约 800 个测试)时,一段时间后弹出 window 错误显示 vstest.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.WhosebugException
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 输出中 window 我得到:
------ 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) ==========
当我尝试启用本地故障转储时,我发现没有这样的注册表项,所以我无法启用。
我找到了导致 vstest.----.exe 崩溃的所有测试(22 个测试),对它们进行了评论,然后 运行 再次测试所有测试,但没有那些 "wrong" 测试。一切 运行 都很好。
这些测试有什么问题?它们都是过去有效的旧测试。如何定位问题?
根据我的经验,WhosebugExeptions 通常是由一些永不终止的递归方法调用引起的。尝试调试这 22 个测试中的一个以查明递归是否是问题所在。
有多种方法可以找到单元测试中 WhosebugException
的原因。
可能最简单的方法是 运行 您在 Visual Studio 调试器下确定的 22 个测试之一。为此,您在 VS 测试资源管理器的上下文菜单中 select "Debug selected tests"。如果发生异常,VS 将中断,您将能够(非常)深入地查看调用堆栈,以准确找到它在方法调用循环中开始循环的位置。
此循环可能有合理的原因(如递归方法)或可能存在错误。在前者的情况下,可能(在许多其他可能性中)一些分层数据发生了变化,因此单元测试现在在递归分析层次结构时达到了极限。
如果您不能 运行 在 VS 调试器中进行单元测试,那么您必须使用 Windows 任务管理器获取崩溃 vstest.executionengine.x86.exe
的内存转储。
为此,您首先要等到您在问题中提到的 Windows 错误报告 (WER) 的 window 弹出。然后以正确的位数打开任务管理器 - 在您的情况下为 32 位。这意味着如果您有 64 位 OS,则必须启动 C:\Windows\SysWOW64\taskmgr.exe
。如果你有一个 32 位 OS 你可以 运行 普通的 C:\Windows\System32\taskmgr.exe
.
然后右键单击 vstest.executionengine.x86.exe
进程并选择 "Create Dump File"。生成的 .dmp 文件可以加载到 VS 或 WinDbg 中,在其中可以使用 SOS 扩展名分析调用堆栈。
要在 VS 中调试内存转储,您可以阅读更多相关内容 here。
关于 WinDbg 你必须下载它 here, set up a few initial configuration settings mentioned here and then list the threads and their call stacks using the commands stated here。
现在您应该很容易找到问题的根本原因。