我该如何解释这个C#堆栈跟踪?第零行出错

时间:2009-04-21 06:26:08

标签: c# asp.net exception stack-trace

我得到一个“对象引用没有设置为对象的实例”错误,日志中的堆栈顶部有以下内容(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”。我从来没有理解那些意思,虽然我认为它们是线上的字符偏移...如果是这种情况,它就不会指向任何有意义的东西(参数声明的中间)。
  3. 这是一个处于发布模式的生产系统,但我仍然可以从堆栈跟踪对象中获取行号。在这种情况下,不幸的是,错误不会在我们的调试系统上重现,所以我坚持不懈地使用它。

    任何建议都将受到赞赏。

    谢谢, 汤姆

2 个答案:

答案 0 :(得分:6)

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

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

每个stacktrace条目后的+ xx数字显然是“byte offset into native code”。我承认它最初在我看来是以刻度或毫秒执行的时间。

答案 1 :(得分:2)

有关了解偏移的信息,请参阅this question。我怀疑你应该只使用调试信息构建生产二进制文件 - 这比检查IL以确定偏移意味着哪条线要容易得多。