加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:05:37 所属栏目:asp.Net 来源:网络整理
导读:我从ASP.NET应用程序返回的堆栈跟踪,从ArgumentNullException生成,给人的印象是下面代码的最后一行发生错误.据我所知,这是不可能的,但如果JIT优化了对Bar的调用,这将导致不同的堆栈跟踪,它将解释所有.我肯定知道它不是c#编译器,因为CIL看起来像我期望的那样.
我从ASP.NET应用程序返回的堆栈跟踪,从ArgumentNullException生成,给人的印象是下面代码的最后一行发生错误.据我所知,这是不可能的,但如果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,context.RequestQueryString(name));
}

private static void CreateHiddenField(HtmlTextWriter tr,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应用程序有何用处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读