Доступ к полю ThreadStatic из профилировщика .NET - PullRequest
0 голосов
/ 30 декабря 2018

Этот вопрос в stackoverflow спрашивает, как реализован [ThreadStatic]: Как работает атрибут ThreadStatic?

Некоторые предположили, что его следует рассматривать как расширение объекта Thread.Я не уверен, означает ли это, что он основан на Win32 TLS.

Мой вопрос: могу ли я каким-то образом получить доступ к значению [ThreadStatic] из текущего потока в коде профилировщика .NET?То есть в нативном коде.

Например, если бы я мог найти с помощью win32 id идентификатор области памяти, где находятся все статические поля потока, и найти конкретные поля, которые мне нужно получить.

Thx

1 Ответ

0 голосов
/ 07 января 2019

Как объяснено в ответах, на которые вы ссылались, функциональность [ThreadStatic] реализуется средой выполнения .NET, а не компилятором C #.

Это означает, что вам придется перепроектировать данные среды выполнения.структуры для получения доступа к нужным данным.

В качестве альтернативы, вы можете использовать интерфейс ICorProfilerInfo.Это неуправляемый интерфейс, как вам требуется.

В частности, вам потребуется метод ICorProfilerInfo2::GetThreadStaticAddress.Он принимает идентификатор класса, идентификатор поля и идентификатор потока в качестве входных аргументов и предоставляет адрес значения поля, локальный для потока с указанным идентификатором.

Если вас интересует, как этоработает, вы можете проверить, например, реализацию Core CLR (найдите метод GetThreadStaticAddress2, также посмотрите threads.cpp для GetStaticFieldAddrNoCreate).Core CLR не использует ОС TLS;вместо этого он поддерживает свою собственную таблицу так называемых ThreadLocalBlock s и ThreadLocalModule s, в которой хранятся данные.

Также существует управляемая Microsoft.Diagnostics.Runtime (CLR MD ) реализация.Он также должен обеспечивать доступ к локальным значениям потока.Тем не менее, он, кажется, сломан сейчас, как комментарий говорит :

// TODO:  Renable when thread statics are fixed.
...