vstest在运行某些特定测试时崩溃了

时间:2016-10-20 09:12:46

标签: c# testing visual-studio-2015 vstest

当我在我的解决方案中运行所有测试(大约800个测试)时,一段时间后会显示一个错误的弹出窗口,表明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.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) ==========

当我尝试启用本地故障转储时,我发现没有这样的注册表项,所以我无法做到。

我找到所有测试(22次测试)导致vstest崩溃.---。exe,评论他们并再次运行所有测试,没有那些“错误”测试。一切都运行良好。

这些测试有什么问题?它们都是过去工作的旧测试。如何找到问题?

2 个答案:

答案 0 :(得分:5)

根据我的经验,StackoverFlowExeptions通常是由一些永不终止的递归方法调用引起的。尝试调试其中一个22测试,以确定递归是否是问题。

答案 1 :(得分:1)

在单元测试中,有多种方法可以找到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中调试内存转储,您可以阅读更多相关信息here

关于WinDbg,你必须下载它here,设置一些提到here的初始配置设置,然后使用here命令列出线程及其调用堆栈。

现在你应该很容易找到问题的根本原因。