asp.net - .NET JIT 编译器会优化方法调用吗?

标签 asp.net .net c#-4.0 clr

我从 ASP.NET 应用程序返回的堆栈跟踪(由 ArgumentNullException 生成)给人的印象是下面代码的最后一行发生了错误。据我所知,这是不可能的,但如果 JIT 优化了对 Bar 的调用(这将导致不同的堆栈跟踪),那就可以解释一切。我确信它不是 c# 编译器,因为 CIL 看起来就像我所期望的那样。 JIT 编译器是否可能删除了对 Bar 的调用?

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...
}

最佳答案

根据http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx ,如果 JITter 内联一个方法调用,它确实会在堆栈跟踪中崩溃。如果您不希望它内联(这可能不是一个好主意),您可以使用

[MethodImpl(MethodImplOptions.NoInlining)] 

关于方法。对于 exe,您还可以使用 INI 文件告诉 JITter 生成跟踪信息(位于链接页面的底部),但我不确定这对于 ASP.NET 应用程序如何工作。

关于asp.net - .NET JIT 编译器会优化方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15955359/

相关文章:

c# - 当 Request 对象中包含所有字段值时,为什么需要 ViewState?

asp.net - Base64字符串压缩

.net - 在 Windows 8 Metro 风格的 c# 应用程序上捕获 Enter 和空格键

c# - 在linq循环中获取以前的值?

c# - ASP.NET 线程 - 我可以使用异步方法还是使用线程?

javascript - 基于 web.sitemap 的 n 层动态菜单

c# - 初始化 Blazor 组件中的对象

c# - 公共(public)服务登记处

wpf - 如何将图片保存在 wpf 中的图像控件上?

c# - 如何使方法返回泛型方法?