堆棧跟蹤我從一個ASP.NET應用程序,從ArgumentNullException產生的後退,給出了下面的代碼的最後一行出現錯誤的印象。據我所看到的,那是不可能的,但如果JIT優化了呼叫Bar
,這將導致不同的堆棧跟蹤,它會說明一切。我知道它不是C#編譯器,因爲CIL看起來就像我期望的那樣。 JIT編譯器是否可以刪除對Bar的調用?.NET JIT編譯器會優化一個方法調用嗎?
C#4,.NET 4.0.30319.1,ASP.NET 4.0.30319.1
編輯: 我應該提到,這是一個釋放配置,優化代碼=開,僅= PDB-調試信息。
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可以嵌入一個方法,如果它符合要求 - 這可能導致它從堆棧跟蹤中「消失」...我想。 – Joshua 2013-04-11 17:45:34
它在那裏,在第一個代碼塊中。我刪除了名稱空間/文件名稱以使其可讀。 – jasper 2013-04-11 17:47:25
什麼你知道,我不認爲這是因爲它是如此之小的堆棧跟蹤。我的猜測是它被內聯,但我不知道編譯器是否發出代碼來保留「正確的」堆棧跟蹤。堆棧跟蹤是否帶有任何行號或字節偏移量? – Joshua 2013-04-11 17:57:34