问题:
Visual Studio 2015不断出现此错误:
无法创建堆栈的新保护页
背景
在其他环境中已经有一些关于此错误的问题,但它们似乎都与Visual Studio中的遗留COM代码或设计器工具的互操作有关。我只是想编辑一个C#源文件。
Windows service / A new guard page for the stack cannot be created
A new guard page for the stack cannot be created
以前,我在使用Code Contracts XML文档工具ccdocgen.exe
时才看到此错误。当我使用VS2013和ccdocgen时,错误在构建时偶尔出现,但它只会崩溃ccdocgen,而不是VS.升级到VS2015之后,如果我使用ccdocgen构建任何使用匿名方法的东西,我经常看到它,但直到现在它仍然只是崩溃了ccdocgen而不是VS.另外值得指出的是,当ccdocgen构建错误时,错误对话框看起来略有不同。
上下文
我目前正在处理的解决方案使用代码合同作为前置条件和后置条件,但根本不使用静态检查器。我在编辑代码时遇到此错误,只是执行简单的操作,例如键入,选择文本,使用Ctrl+C
或Ctrl+X
。自从那个开始以来,我已经禁用了我目前正在处理的项目中的所有代码合同工具(但不是在整个解决方案中),但错误仍然偶尔会出现。< / p>
根据有关此错误消息的其他问题的答案,它是由某处的堆栈溢出引起的。由于在编辑文本时发生了这个错误,而且我已经进入VS2015,因此我的假设是它与Roslyn正在进行的一些后台解析有关。
某些代码: 编辑:我收到错误,此属性的两个版本都被注释掉了,所以不是它。
这是我认为导致此问题的成员:
public DataView JoinedRecords =>
(from r1 in Table1.AsEnumerable()
join r2 in Table2.AsEnumerable()
on r1.Field<int>("ID") equals r2.Field<int>("ID")
where r2.Field<bool>("IsPending")
select r1)
.CopyToDataTable().AsDataView();
如果我删除查询语法,则会减少错误:
public DataView JoinedRecords =>
query = Table1.AsEnumerable()
.Join(Table2.AsEnumerable(),
r1 => r1.Field<int>("ID"),
r2 => r2.Field<int>("ID"),
(r1, r2) => r1)
.CopyToDataTable().AsDataView();
问题:
编辑:其他疑难解答步骤
根据这篇文章(Visual Studio 2015 Not Working)的建议,我使用崩溃记录器将问题发送给Microsoft。
我还使用/log
参数运行了VS,并在日志中发现了2个错误,但它们听起来并不相关。
<entry>
<record>563</record>
<time>2016/06/29 16:00:08.841</time>
<type>Error</type>
<source>Extension Manager</source>
<description>Extension will not be loaded because an extension with the same ID 'Microsoft.Windows.DevelopmentKit.Desktop' is already loaded at C:\PROGRAM FILES (X86)\COMMON FILES\MICROSOFT\EXTENSIONMANAGER\EXTENSIONS\MICROSOFT\WINDOWS KITS\8.0\DESKTOP SDK\...</description>
<path>C:\PROGRAM FILES (X86)\COMMON FILES\MICROSOFT\EXTENSIONMANAGER\EXTENSIONS\MICROSOFT\WINDOWS KITS\8.1\DESKTOP SDK\</path>
</entry>
<entry>
<record>564</record>
<time>2016/06/29 16:00:09.587</time>
<type>Error</type>
<source>Color Theme Service</source>
<description>The color 'Popup' in category 'de7b1121-99a4-4708-aedf-15f40c9b332f' does not exist. </description>
</entry>
编辑2:更多详情
我还注意到,当弹出错误对话框时,但在点击“确定”之前,许多Visual Studio进程在任务管理器中看起来仍然正常。 devenv
,PerfWatson
,VsHub
和Microsoft.VsHub.Server.HttpHost
仍在运行,并且具有波动的工作集,句柄和线程统计信息。 VBCSCompiler
和MSBuild
仍在运行,但没有波动(通常在未运行构建时就是这种情况)。
修改:
在VS2015 Update 1和升级到Update 3之后都出现了问题。
Code Contracts v1.9已经出现问题,尝试卸载并重新安装CC 1.9无效。
可能的修复?
已安装CC v1.10-RC2,我已经工作了几分钟而没有VS崩溃。
将在以下任何一方发布后续行动:
答案 0 :(得分:3)
我是否相信这是罗斯林问题?
我认为Roslyn不太可能是导致这个问题的直接原因。特别是因为这条数据。
当我使用带有ccdocgen的VS2013时,在构建时偶尔出现错误,但它只会崩溃ccdocgen,而不是VS
Roslyn直到VS2015才发货。在此之前,编译器是一段完全不同的代码(本机代码与托管代码)。虽然这两个编译器都可能存在相同的错误,但这种特定类型的问题不太可能发生。
我认为这更可能是代码合约的问题。特别是Roslyn和本机编译器产生的IL序列相同,导致Code Contracts出现问题。
我将通知代码合同团队,了解他们的分析。
答案 1 :(得分:0)
我有同样的问题。我处理了递归调用。错误消失了。 因此,我建议您在开始的任何递归函数中添加一些退出点。 或者只是尝试评论递归调用, 要验证这种情况的发生仅仅是由于递归调用引起的堆栈溢出。
如果不是递归调用,则可能是无限循环。
祝你好运!