8

当在 Asp.Net 网页中引发异常时,会显示一条错误消息以及完整的堆栈跟踪。

下面的例子:

堆栈跟踪:
IndexOutOfRangeException:索引超出了数组的范围。

MyNameSpace.SPAPP.ViewDetailsCodeBehind.LoadView() +5112 MyNameSpace.SPAPP.ViewDetailsCodeBehind.Page_Load(Object sender, EventArgs e) +67
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) + 13
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者,EventArgs e)+43
System.Web.UI.Control.OnLoad(EventArgs e)+98
... ...

问题是显示的行号与我的代码中引发异常的行不对应。
在上面的示例中,堆栈显示行号 5111,但我在 .cs 文件后面的代码只有 250 行!

aspx 页面存储在 SharePoint 站点中,并且包含后面代码的程序集已部署到 GAC。另外,我已经在调试模式下编译。

鉴于上述设置,我怎样才能找出我的代码中的哪一行导致了异常?



strelokstrelok指出的澄清:

发布模式下,异常前面的数字不是代码行。相反,它是对本机编译代码的偏移,这对人类没有任何意义。更多关于这里的信息:http: //odetocode.com/Blogs/scott/archive/2005/01/24/963.aspx

调试模式下,PDB 文件将自动将本机代码偏移量映射到代码中的 .cs 行,并且显示的数字将是代码中的相应行。

4

3 回答 3

11

这些数字不是行号。在发布模式下,堆栈跟踪包含本地编译代码的偏移量,而不是行号。你可以在这里阅读更多关于它的信息:http: //odetocode.com/Blogs/scott/archive/2005/01/24/963.aspx

在堆栈跟踪中获取行号的唯一方法是在调试模式下使用可用的 PDB 文件构建代码。

于 2009-02-02T11:12:29.647 回答
3

您的代码隐藏文件不是完整的类,它只是整个类由 ASP.NET 编译时使用的一部分。要找到该行的真正内容,请使用 Reflector 之类的工具查看已编译的类/程序集。

于 2009-01-29T16:00:33.030 回答
0

也许正在运行的代码不是您在屏幕上看到的。有些伙伴可能已经为你重构了它。:)

于 2009-02-02T10:35:35.647 回答