从 .NET 探查器访问 ThreadStatic 字段

Accessing ThreadStatic field from .NET profiler

Whosebug中的这个问题问的是[ThreadStatic]是如何实现的: How does the ThreadStatic attribute work?

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

我的问题是我能否以某种方式从 .NET 探查器代码中的当前线程访问 [ThreadStatic] 的值?也就是说,在本机代码中。

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

感谢

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

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

或者,您可以使用 ICorProfilerInfo 界面。这是一个非托管接口,正如您所需要的。

特别是,您需要 ICorProfilerInfo2::GetThreadStaticAddress 方法。它接受一个 class ID、一个字段 ID 和一个线程 ID 作为输入参数,并提供字段值的地址,该地址对于具有指定 ID 的线程来说是本地的。

如果您对它的工作原理感兴趣,可以查看例如Core CLR's implementation (search for the GetThreadStaticAddress2 method, also look threads.cpp 对应 GetStaticFieldAddrNoCreate)。核心 CLR 不使用 OS TLS;相反,它维护自己的 table 所谓的 ThreadLocalBlocks 和 ThreadLocalModules 存储数据。

还有一个托管的 Microsoft.Diagnostics.Runtime (CLR MD) implementation. It should also provide an access to the thread-local values. However, it seems to be broken now, as a comment says:

// TODO:  Renable when thread statics are fixed.