【发布时间】:2013-04-11 17:41:35
【问题描述】:
我从一个由 ArgumentNullException 生成的 ASP.NET 应用程序返回的堆栈跟踪给人的印象是下面代码的最后一行发生了错误。据我所知,这是不可能的,但如果 JIT 优化了对 Bar 的调用,这将导致不同的堆栈跟踪,它会解释一切。我确定它不是 c# 编译器,因为 CIL 看起来像我所期望的那样。 JIT 编译器是否可能删除了对 Bar 的调用?
c#4、.NET 4.0.30319.1、ASP.NET 4.0.30319.1
编辑: 我应该提到这是一个发布配置,Optimize code = on,Debug Info = pdb-only。
Stack Trace:
[ArgumentNullException: Value cannot be null. Parameter name: value]
CreateHiddenField(HtmlTextWriter tr, String name, String value) in Foo.cs:129
Foo(IHttpContext context, HtmlTextWriter writer) in Foo.cs:106
private static void Foo(IHttpContext context, HtmlTextWriter writer)
{ // line 103
Bar(writer, AuthorizationServerResponseDetailsHttpRequestParser.RequestSAMLFieldName, context);
Bar(writer, AuthorizationServerResponseDetailsHttpRequestParser.RequestTargetFieldName, context);
// line 106 - blank line in source code.
CreateHiddenField(tr, name, string.Empty); // looks like its here
}
private static void Bar(HtmlTextWriter tr,string name, IHttpContext context)
{ // line 116
#region Sanitation
if (tr == null) { throw new System.ArgumentNullException("tr"); }
if (name == null) { throw new System.ArgumentNullException("name"); }
if (context == null) { throw new System.ArgumentNullException("context"); }
#endregion
CreateHiddenField(tr, name, context.RequestQueryString(name));
}
private static void CreateHiddenField(HtmlTextWriter tr, string name, string value)
{ // line 127
#region Sanitation
if (tr == null) { throw new System.ArgumentNullException("tr"); }
if (name == null) { throw new System.ArgumentNullException("name"); }
if (value == null) { throw new System.ArgumentNullException("value"); }
#endregion
// payload...
}
【问题讨论】:
-
你能提供堆栈跟踪吗?如果 JIT 符合要求,它可以内联一个方法——这可能会导致它从堆栈跟踪中“消失”......我认为。
-
它在第一个代码块中。我删除了命名空间/文件名以使其可读。
-
你知道吗,我不认为这是一个堆栈跟踪,因为它太小了。我的猜测是它是内联的,但我不知道编译器是否发出代码来保持“正确”的堆栈跟踪。堆栈跟踪是否带有任何行号或字节偏移量?
-
AuthorizationServerResponseDetailsHttpRequestParser...不错的一个:) -
@Joshua 在那里更新了堆栈跟踪中的行号以及代码。