1

我在日志中的堆栈顶部收到“对象引用未设置为对象的实例”错误(C# ASP.NET 应用程序):

@Web.UI.UserBrochurePage.Page_Load(Object,EventArgs)+25 Line: 0  
@System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr,Object,Object,EventArgs)+0 Line: 0  
@System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object,EventArgs)+26 Line: 0  
@System.Web.UI.Control.OnLoad(EventArgs)+38 Line: 0 
@System.Web.UI.Control.LoadRecursive()+35 Line: 0
@System.Web.UI.Page.ProcessRequestMain(Boolean,Boolean)+1160 Line: 0 

我不明白的事情:

  1. 每个错误都在零行
  2. 最有趣的错误(在我的代码中最上面的错误)后面有一个“+25”。我从来不明白这些是什么意思,尽管我认为它们是在线上的字符偏移量......如果是这样的话,它就不会指向任何有意义的东西(参数声明的中间)。

这是一个处于发布模式的生产系统,但我通常仍然可以从堆栈跟踪对象中获取行号。在这种情况下,不幸的是,该错误不会在我们的调试系统上重现,所以我只能尽力而为。

任何意见,将不胜感激。

谢谢,汤姆

4

2 回答 2

6

我认为您在堆栈跟踪中的每个调用都会看到“第 0 行”,因为您的代码是在发布模式而不是调试模式下编译的。在调试模式下,您的代码将被编译为包含一个调试符号文件 (.pdb)。当此文件可用时,您的异常堆栈跟踪将准确表示行号。

在任何情况下,只有 Page_Load 的行号很重要,因为其余的是框架程序集的内部调用。

每个堆栈跟踪条目之后的 +xx 数字显然是“本地代码的字节偏移量”。我承认,最初在我看来,这是执行时间,以滴答或毫秒为单位。

于 2009-04-21T06:38:48.177 回答
2

有关了解偏移量的信息,请参阅此问题。我怀疑您真的应该只在其中构建带有调试信息的生产二进制文件 - 这比检查 IL 来确定偏移量意味着哪一行要容易得多。

于 2009-04-21T06:35:59.430 回答