从 .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 所谓的 ThreadLocalBlock
s 和 ThreadLocalModule
s 存储数据。
还有一个托管的 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.
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 所谓的 ThreadLocalBlock
s 和 ThreadLocalModule
s 存储数据。
还有一个托管的 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.