c# - 堆栈跟踪中的错误行号

标签 c# asp.net .net

问题

在我们的 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/

相关文章:

C# - 自动实现的事件

c# - 为什么 F# 按位运算符为有符号类型填充 1?

asp.net - C# 可选对象操作 MVC 参数

C#/.Net : Returning a file to the browser?

c# - 如何检测窗口是否闪烁

c# - 林克 "Could not translate expression... into SQL and could not treat it as a local expression."

c# - 替换特定字符之间的数据

asp.net - 在 ASP.NET Web 应用程序中工作时,您将哪些文件检入源代码控制管理系统?

c# - 使用 asp.net 中的 Web 服务的网站登录表单

c# - 使用 RavenDB 和 LINQ 从子集中查找至少包含一个元素的对象