如何纠正 Stack UNDERflow 错误
How to correct Stack UNDERflow error
当我尝试在我正在使用的应用程序中执行特定过程时,我得到了一个 InvalidProgramException,当它已经用优化编译时(Visual Studio 2015)。我使用 PEVerify 查看它对问题的描述,它告诉我 "Method[offset 0x00000351] Stack underflow".
显然我可以通过关闭优化来解决问题,但这不是最佳解决方案,因为等待 MS 在下一个版本中修复导致它的任何错误。
如何修复堆栈下溢错误?如果我不得不猜测,我会说这可能与这个 class 大约有 18k 行有关,但我对此无能为力...
编辑:明确地说,我不希望得到类似 "delete lines 6276 and 6277" 的答案,我正在寻找的是解决此问题的一般策略.net 中的问题类型。类似于此 ActionScript 问题的答案:How to debug a runtime stack underflow error?,但特定于 .net 的除外。我发布这个是为了让下一个遇到此类问题的人有一个起点,他们可能会尝试解决这个问题。
好的,首先,无效程序异常指示 something is wrong with the compiler, not your application。这意味着您可以在没有 运行 您的应用程序的情况下测试问题是否仍然存在(或已经演变为不同的问题)。一旦你看到这个错误,你就脱离了正常的调试场景——你没有做错什么,因此无法通过检查变量和查看你在哪里做错了事来找到或解决问题。
第一个怀疑可能是优化--没有优化的构建,看看你的 exe 是否仍然搞砸了。如果是这样,您可以考虑关闭优化以作为一种充分的解决方法。您甚至可以使用 System.Runtime.CompilerServices.Methodimpl(methodimploptions.nooptimization) 为特定方法关闭它。
如果不是,或者那没有改变任何东西,您想找出是什么触发了错误,一个很好的起点是 Peverify。 运行 它针对编译后的 exe,它会列出所有存在错误代码的地方,即使它是一个未调用的方法。
由于这是一个编译器错误,您无法单步执行方法来准确查看哪一行被关闭。这有它的好处——您不必有一个有效的(或者如我上面所说的,可访问的)方法。只要代码编译通过,它就会有问题或没有问题,因此您可以通过注释掉或删除导致问题的方法中的行来找到有问题的行。
当我尝试在我正在使用的应用程序中执行特定过程时,我得到了一个 InvalidProgramException,当它已经用优化编译时(Visual Studio 2015)。我使用 PEVerify 查看它对问题的描述,它告诉我 "Method[offset 0x00000351] Stack underflow".
显然我可以通过关闭优化来解决问题,但这不是最佳解决方案,因为等待 MS 在下一个版本中修复导致它的任何错误。
如何修复堆栈下溢错误?如果我不得不猜测,我会说这可能与这个 class 大约有 18k 行有关,但我对此无能为力...
编辑:明确地说,我不希望得到类似 "delete lines 6276 and 6277" 的答案,我正在寻找的是解决此问题的一般策略.net 中的问题类型。类似于此 ActionScript 问题的答案:How to debug a runtime stack underflow error?,但特定于 .net 的除外。我发布这个是为了让下一个遇到此类问题的人有一个起点,他们可能会尝试解决这个问题。
好的,首先,无效程序异常指示 something is wrong with the compiler, not your application。这意味着您可以在没有 运行 您的应用程序的情况下测试问题是否仍然存在(或已经演变为不同的问题)。一旦你看到这个错误,你就脱离了正常的调试场景——你没有做错什么,因此无法通过检查变量和查看你在哪里做错了事来找到或解决问题。
第一个怀疑可能是优化--没有优化的构建,看看你的 exe 是否仍然搞砸了。如果是这样,您可以考虑关闭优化以作为一种充分的解决方法。您甚至可以使用 System.Runtime.CompilerServices.Methodimpl(methodimploptions.nooptimization) 为特定方法关闭它。
如果不是,或者那没有改变任何东西,您想找出是什么触发了错误,一个很好的起点是 Peverify。 运行 它针对编译后的 exe,它会列出所有存在错误代码的地方,即使它是一个未调用的方法。
由于这是一个编译器错误,您无法单步执行方法来准确查看哪一行被关闭。这有它的好处——您不必有一个有效的(或者如我上面所说的,可访问的)方法。只要代码编译通过,它就会有问题或没有问题,因此您可以通过注释掉或删除导致问题的方法中的行来找到有问题的行。