问题
在我们的 ASP .net 网站上,我总是在异常堆栈跟踪中得到错误的行号。我说的是我们的生活环境。似乎有一种模式:堆栈跟踪将始终指向包含该方法的右大括号的行。
例如:
public class Foo
{
public void Bar()
{
object someObject = null;
someObject.ToString();
/*
arbitrarily more lines of code
*/
} // this line will be the one that the stack trace points to
}
更多详情
需要说明的是:这不仅发生在某些方法上,它发生在我们记录的每个异常上。所以我会在这里排除(JIT)优化,这可能导致行号看似随机关闭。令我困扰的是,错误的行号似乎始终指向包含方法的右大括号。
请注意,在 .net 4.6 之前,框架中实际上存在一个错误,如果您针对 x64 进行编译,就会发生这种情况。但是,Microsoft 确认此问题已得到修复。还为此运行了一个最小的示例应用程序,重申了他们的主张。但出于某种原因,它仍然发生在网络服务器上。
更让我困惑的是,它并没有发生在我们的测试和开发环境中。测试和实时系统的设置非常相似。唯一真正的区别是,我们在现场运行的是 Windows Server 2012,而在测试系统上,我们仍在使用 Windows Server 2008。
我检查了什么
- pdb 文件有效(使用 chkmatch 测试)
- 编译时代码优化不是问题
- 前面提到的 .net 4.6 之前的错误无法用最小的例子重现
- .NET版本完全一样
- 构建来自同一个部署脚本
非常感谢解决此问题的任何线索。如果您知道我们可以检查的任何内容,请告诉我。
最佳答案
编译优化以及运行时优化可以改变实际的执行,以及构建的调用堆栈信息。所以你不能那么认真地对待数字。
更多信息可以在 Scott Hanselman 的帖子中找到:Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks .
如果不触及您的位,就很难对特定案例进行故障排除。但是,如果您了解 WinDbg,您可能会在异常发生时通过实时调试应用程序来深入研究。然后您可以转储实际的 jitted 机器代码以及其他运行时信息,以确定行号是如何构造的。
关于c# - 堆栈跟踪中的错误行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37072185/