当前位置: 首页 > news >正文

赣州网站开发制作郴州seo服务

赣州网站开发制作,郴州seo服务,创建团购网站,湖南微信网站营销一#xff1a;背景 1. 讲故事 写这篇是起源于训练营里有位朋友提到了一个问题#xff0c;在 !t -special 输出中有一个 SuspendEE 字样#xff0c;这个字样在 coreclr 中怎么弄的#xff1f;输出如下#xff1a; 0:000 !t -special ThreadCount: 3 UnstartedTh…一背景 1. 讲故事 写这篇是起源于训练营里有位朋友提到了一个问题在 !t -special 输出中有一个 SuspendEE 字样这个字样在 coreclr 中怎么弄的输出如下 0:000 !t -special ThreadCount: 3 UnstartedThread: 0 BackgroundThread: 2 PendingThread: 0 DeadThread: 0 Hosted Runtime: noLock DBG ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception0 1 4ab0 000001CC44E5C490 2a020 Cooperative 0000000000000000:0000000000000000 000001cc44e520d0 -00001 MTA (GC) 11 2 19d8 000001CC44E84700 21220 Preemptive 0000000000000000:0000000000000000 000001cc44e520d0 -00001 Ukn (Finalizer) 12 3 6668 000001CC44ED4520 2b220 Preemptive 0000000000000000:0000000000000000 000001cc44e520d0 -00001 MTA OSID Special thread type0 4ab0 SuspendEE 10 3b6c DbgHelper 11 19d8 Finalizer 哈哈其实我特别能理解很多人学了高级调试之后好奇心会爆棚看啥都想探究底层有一种技术上的重生这篇我们就好好聊一聊。 二WinDbg 分析 1. SuspendEE 标记是什么 这个单词全称为 Suspend Engine Execution 即 冻结执行引擎 那冻结执行引擎的入口方法在哪里呢这个考验着你对GC运作骨架图的认识在 coreclr 源码中有一个骨架图简化后如下 GarbageCollectGeneration(){SuspendEE();garbage_collect();RestartEE();}garbage_collect(){generation_to_condemn();gc1();} 上面的 SuspendEE() 即 SOS 中的 SuspendEE 标记的入口函数接下来我们深入探究下这个方法。 2. SuspendEE 到底做了什么 如果你仔细阅读过 SuspendEE() 方法的源代码你会发现核心枚举变量是 ThreadType_DynamicSuspendEE它起到了定乾坤的作用参考代码如下 thread_local size_t t_ThreadType;void ThreadSuspend::SuspendEE(SUSPEND_REASON reason) {// set tls flags for compat with SOSClrFlsSetThreadType(ThreadType_DynamicSuspendEE); }void ClrFlsSetThreadType(TlsThreadTypeFlag flag) {t_ThreadType | flag;gCurrentThreadInfo.m_EETlsData (void**)t_ThreadType - TlsIdx_ThreadType; }enum PredefinedTlsSlots {TlsIdx_ThreadType 11 // bit flags to indicate special threads type };enum TlsThreadTypeFlag // flag used for thread type in Tls data {ThreadType_DynamicSuspendEE 0x00000020, } 从上面的代码中可以看到 t_ThreadType 是一个 C 级的线程本地存储意味着每一个线程都有其备份同时它也是 SuspendEE 标记的核心来源如果 m_EETlsData 的第 11号 槽位为 0x20 的时候 SuspendEE 标记就会被成功打下并且可以通过 gCurrentThreadInfo.m_EETlsData 变量去跟踪来源有了这么多信息之后接下来就可以代码验证了。 三案例验证 1. 一段测试代码 代码非常简单就是一个简单的手工 GC触发。 internal class Program{static void Main(string[] args){Debugger.Break();GC.Collect();Console.ReadLine();}} 接下来使用 windbg 在入口的 SuspendEE 方法上下断点 bp coreclr!ThreadSuspend::SuspendEE 观察截图如下 一旦将 ThreadType_DynamicSuspendEE0x20 赋值之后接下来用 windbg 去做个验证。 0:000 x coreclr!*gCurrentThreadInfo* 000001a1668ee8c0 coreclr!gCurrentThreadInfo struct ThreadLocalInfo0:000 dx -id 0,0 -r1 (*((coreclr!ThreadLocalInfo *)0x1a1668ee8c0)) (*((coreclr!ThreadLocalInfo *)0x1a1668ee8c0)) [Type: ThreadLocalInfo][0x000] m_pThread : 0x1a166902e50 [Type: Thread *][0x008] m_pAppDomain : 0x1a166948b40 [Type: AppDomain *][0x010] m_EETlsData : 0x1a1668ee880 [Type: void * *]0:000 dp 0x1a1668ee880 000001a1668ee880 0000000000000000 0000000000000000 000001a1668ee890 0000000000000000 0000000000000000 000001a1668ee8a0 0000000000000000 0000000000000000 000001a1668ee8b0 0000000000000000 0000000000000000 000001a1668ee8c0 000001a166902e50 000001a166948b40 000001a1668ee8d0 000001a1668ee880 0000000000000020 从上面输出可以看到 000001a1668ee8d00x8 地址的内容已经被成功种下相信这时候 !t -special 也能拿到标记了。 0:000 !t -specialLock DBG ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception0 1 640c 000001A166902E50 2a020 Preemptive 000001A16B0094A8:000001A16B00A5B8 000001a166948b40 -00001 MTA (GC) 11 2 3e50 000001A16692B2D0 21220 Preemptive 0000000000000000:0000000000000000 000001a166948b40 -00001 Ukn (Finalizer) 12 3 6a24 000001A16699F8F0 2b220 Preemptive 0000000000000000:0000000000000000 000001a166948b40 -00001 MTA OSID Special thread type0 640c SuspendEE 10 76b0 DbgHelper 11 3e50 Finalizer 那这个 0x20 什么时候被拿掉呢? 这个在源码中也能找到相应的答案继续 go 运行输出如下 void ClrFlsClearThreadType(TlsThreadTypeFlag flag) {t_ThreadType ~flag; }0:012 dp 0x1a1668ee880 000001a1668ee880 0000000000000000 0000000000000000 000001a1668ee890 0000000000000000 0000000000000000 000001a1668ee8a0 0000000000000000 0000000000000000 000001a1668ee8b0 0000000000000000 0000000000000000 000001a1668ee8c0 000001a166902e50 000001a166948b40 000001a1668ee8d0 000001a1668ee880 0000000000000000 当然如果你去寻找 sos 的源码实现也会找到相应的答案。 HRESULT PrintSpecialThreads() {...if (ThreadType ThreadType_DynamicSuspendEE){type SuspendEE ;}...return Status; } 四总结 挖掘这个标记的前世今生回头看其实还是挺有意思的coreclr 居然新增了 m_EETlsData 字段来给 sos 做妥协哈哈这彰显了 sos 一等公民的地位。
http://www.hkea.cn/news/14564980/

相关文章:

  • 什么程序做网站安全新闻文章网站源码
  • 收费网站建设视频教程免费下载无锡网页设计培训班
  • 莱西做网站网站域名不变网站可以从做吗
  • 门户网站网站开发广州编程课程培训机构排名
  • 沭阳网站建设招聘jq 网站模板
  • 如何做一份网站的数据分析软件开发 网站开发 不同
  • 龙游做网站企业网站的设计
  • 建设网站 莆田网站设计公司西安
  • 投资理财产品的网站建设画册专业设计公司
  • dede 网站搬家应用软件下载app
  • 浙江网站建设与维护书二次开发客户的话术
  • 云主机网站的空间在哪浏览器2345网址导航下载安装
  • 哪里有好网站设计wordpress网站性能
  • 响应式布局网站开发太原不错的互联网公司
  • 网站制作难点镜像wordpress博客
  • 宁波网站设计公司qq创号申请注册网站
  • asp.net 制作网站教程公众号登录网址
  • 网站的功能定位和建设运营规划自助创建网站
  • 甘肃网站建设推广首都之窗
  • 湖北省建设厅网站怎么打不开谷歌搜索引擎为什么打不开
  • 网站建设与维护实训总结现在做网站怎么赚钱
  • 网站logo怎么做动态鞍山最新招聘
  • 做网站必须用tomcat推广软文范例100字
  • wordpress网站模版wordpress本地 域名
  • 企业网站建设规划设计任务书wordpress单图模式
  • 响应云网站模板下载北京王府井在几环
  • 网站建设策划书的撰写沧浪企业建设网站方法
  • 门户网站系统开发建立网上商城应考虑哪些问题
  • 龙华区城市建设局网站聊天app开发费用
  • 建设人力资源服务网站工作方案wordpress怎么改头像