Śledzenie stosu, które otrzymuję z aplikacji ASP.NET, wygenerowane z ArgumentNullException, daje wrażenie, że wystąpił błąd w ostatnim wierszu poniższego kodu. O ile widzę, jest to niemożliwe, ale gdyby JIT zoptymalizował wywołanie do Bar
, co skutkowałoby innym śladem stosu, wyjaśniałoby to wszystko. Wiem na pewno, że nie jest to kompilator C#, ponieważ CIL wygląda tak, jak bym się spodziewał. Czy jest możliwe, że kompilator JIT usunął wywołanie do paska?Czy kompilator .NET JIT zoptymalizuje wywołanie metody?
C# 4, .NET 4.0.30319.1, ASP.NET 4.0.30319.1
EDIT: powinny wspomniałem jest to konfiguracja release, z kodem Optymalizacja = on, Debug Info = PDB tylko .
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...
}
Czy możesz podać ślad stosu? JIT może wbudować metodę, jeśli spełnia ona wymagania - co może spowodować "zniknięcie" ze śladu stosu ... Myślę. – Joshua
jest tam, w pierwszym bloku kodu. Usunąłem nazwy przestrzeni/plików, aby były czytelne. – jasper
Co wiesz, nie sądziłem, że był to ślad stosu, ponieważ był tak mały. Domyślam się, że został on zainicjowany, ale nie wiem, czy kompilator emituje kod, aby zachować "właściwy" ślad stosu, czy nie. Czy śledzenie stosu ma jakiś numer linii lub przesunięcia bajtów? – Joshua