当我在使用优化编译的应用程序中尝试执行特定过程时,我得到一个InvalidProgramException(Visual Studio 2015)。我用PEVerify看看它对这个问题的看法,它告诉我“Method [offset 0x00000351] Stack underflow”。
显然,我可以通过关闭优化来解决问题,但这不是最佳解决方案,等待MS修复下一版本中导致错误的任何错误。
如何修复堆栈下溢错误?如果我不得不猜测我可能会说这可能与这个班级大约18k线的事实有关,但是我不能做很多事情......
编辑:为了清楚起见,我不希望得到“删除行6276和6277”的答案,我正在寻找的是解决此类问题的一般策略在.net。类似于ActionScript问题的答案:How to debug a runtime stack underflow error?,除了特定于.net。我发布这个帖子,以便下一个遇到此类问题的人有一个起点,可以尝试解决这个问题。
答案 0 :(得分:2)
好的,首先关闭无效程序异常表示something is wrong with the compiler, not your application。这意味着您可以在不运行应用程序的情况下测试问题是否仍然存在(或已经演变成另一个问题)。一旦你看到这个错误,你就不在正常的调试场景中 - 你没有做错什么,因此无法通过检查变量并查看你做错了什么来找到或解决问题。
第一个嫌疑人可能是优化 - 没有优化的构建,看看你的exe是否仍然搞砸了。如果是这样,您可以考虑将优化转为足够的解决方法。您甚至可以使用System.Runtime.CompilerServices.Methodimpl(methodimploptions.nooptimization)将其关闭以用于特定方法。
如果没有,或者没有改变任何东西,你想知道是什么触发了这个bug,一个很好的注意点就是Peverify。针对编译的exe运行它,它将列出所有存在错误代码的地方,即使它是一个未调用的方法。
由于这是一个编译器错误,因此您无法单步执行某个方法来确切地查看哪条线已关闭。这有它的好处 - 你不必有一个功能(或我上面说,可达)方法。只要代码编译,它就会有问题,所以你可以通过注释掉或删除引起问题的方法中的行来找到有问题的行。