Чего ты здесь пытаешься достичь?
Посмотрите на аналогичный вопрос, на который я ответил около месяца назад: Как получить текущее значение EIP в управляемом коде? . Вы можете получить вдохновение от этого. Или вы можете решить, что это слишком некрасиво (+1 для последнего).
Если все, что вы хотите сделать, - это собрать «уникальные» пути вызовов в рамках сеанса программы, продолжайте: я был бы очень уверен использовать ткач AOP и нить локальное хранилище. Это было бы не так уж сложно.
Предупреждение 1: Хеши не очень полезны для общих объектов .NET
Хеш-код случайного объекта может изменяться в зависимости от его местоположения в куче. Для справки: в MONO, с отключенным распределителем движущейся кучи, Object :: GetHash - это симпатичный кусочек кода ( mono / metadata / monitor.c )
#else
/*
* Wang's address-based hash function:
* http://www.concentric.net/~Ttwang/tech/addrhash.htm
*/
return (GPOINTER_TO_UINT (obj) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
#endif
Конечно, с движущимся распределителем дела обстоят немного сложнее, чтобы гарантировать постоянный хэш на протяжении всего срока службы объекта, но вы понимаете: каждая среда выполнения генерирует разные хэши, а количество выполненных выделений изменяет будущее хеш-коды по умолчанию для идентичных объектов.
Предостережение 2: Ваш стек будет содержать инопланетные фреймы
Даже если вы исправили эту часть, предоставив надлежащие детерминированные хеш-функции, вам потребуется, чтобы каждый стековый фрейм имел тип 'recgonizable'. Это, вероятно, не будет иметь место. Конечно, нет, если вы используете что-то похожее на LINQ, анонимные типы, статические конструкторы, делегаты; все виды вещей могут быть чередованием стековых кадров с (анонимными) вспомогательными типами или даже батутами производительности, изобретенными JIT-компилятором для оптимизации хвостовой рекурсии, большой таблицей переходов переключения или совместным использованием кода между несколькими перегрузками.
Вывод: анализ стека сложен: вы обязательно должны использовать надлежащий API, если вы собираетесь его проводить.
Вывод:
Обязательно есть мяч. Но прислушайтесь к совету
- ваши требования нестандартны (подчеркнуто библиотекой времени выполнения, не поддерживающей ее); Обычно это признак того, что: вы решаете уникальную проблему (но пересматриваете выбранный инструмент?) Или решаете ее неправильно
- Возможно, вы могли бы получить гораздо больше информации, генерируя потоковый граф с некоторым рукописным кодом моделирования вместо того, чтобы пытаться подключиться к CLR VM
- если вы собираетесь это сделать, используйте соответствующий API (вероятно, API-интерфейс профилировщика, поскольку профилировщик выборки сохранит именно это: складывает «отпечатки пальцев» каждые так много инструкций)
- Если вы действительно должны сделать это, используя свой код, подумайте об использовании AOP