从.NET探查器访问ThreadStatic字段

时间:2018-12-30 13:25:31

标签: c# .net profile threadstatic

stackoverflow中的此问题询问如何实现[ThreadStatic]: How does the ThreadStatic attribute work?

有人建议应将其视为Thread对象的扩展。 我不确定这是否意味着它基于Win32 TLS。

我的问题是,我可以通过某种方式从.NET探查器代码中的当前线程中访问[ThreadStatic]的值吗?也就是说,使用本地代码。

例如,如果我可以使用win32线程ID在内存中找到所有线程静态字段所在的区域,并找到我需要检索的特定字段。

Thx

1 个答案:

答案 0 :(得分:3)

如您所引用的答案中所述,[ThreadStatic]功能由.NET运行时而不是C#编译器实现。

这意味着,您需要对运行时的数据结构进行逆向工程才能访问所需的数据。

或者,您可以使用ICorProfilerInfo界面。根据需要,这是一个非托管界面。

尤其是,您需要使用ICorProfilerInfo2::GetThreadStaticAddress方法。它接受类ID,字段ID和线程ID作为输入参数,并提供具有指定ID的线程本地的字段值的地址。

如果您对它的工作方式感兴趣,可以检查例如Core CLR's implementation(搜索GetThreadStaticAddress2方法,也为GetStaticFieldAddrNoCreate寻找threads.cpp)。 Core CLR不使用OS TLS;相反,它维护着自己的表ThreadLocalBlockThreadLocalModule,这些表用于存储数据。

还有一个托管的 Microsoft.Diagnostics.Runtime CLR MD)实现。它还应该提供对线程局部值的访问。但是,它现在似乎已被破坏,如a comment says

// TODO:  Renable when thread statics are fixed.