Можно ли получить значения параметров для каждого кадра в стеке вызовов в .NET - PullRequest
10 голосов
/ 04 мая 2009

Я говорю об управляемом .NET-коде. Если мы запустим какую-либо программу и подключим к ней VS, мы сможем увидеть значения параметров для каждого метода в стеке вызовов. Я хотел бы создать решение для ведения журнала, которое будет регистрировать значения всех параметров для каждого метода в стеке вызовов. На самом деле мне нужна эта информация в случае возникновения исключения.

Я знаю, что это возможно с помощью профилирования API. Но мне интересно, возможно ли это только с помощью управляемого кода?

ОБНОВЛЕНИЕ: Хорошо, возможно, с чистым .NET это невозможно. Тогда может быть с каким-то неуправляемым кодом ... смысл в том, чтобы сделать это из самого приложения. Приложение в случае исключения может вызвать некоторую библиотеку (может быть неуправляемую), которая возвращает информацию о значениях методов в стеке вызовов. Просто мысли ...

Ответы [ 2 ]

7 голосов
/ 04 мая 2009

Значения параметров не сохраняются в экземпляре StackFrame. На самом деле они вообще не записываются / не регистрируются, если вы не решите сделать это явно.

Одним из очевидных способов регистрации значений тезисов является использование AOP. Это, безусловно, подразумевает затраты, но в сочетании с каркасом ведения журнала и правильным уровнем ведения журнала это может быть альтернативой. Вы также можете выбрать инструмент только некоторых типов / методов в вашем базовом коде, где с большей вероятностью будут генерироваться исключения. Вероятно, я бы выбрал Postsharp для его статического ткачества, чтобы генерировать журналы вызовов.

В любом случае, это далеко не идеальное решение, но, боюсь, у вас не будет много вариантов, если вы застряли в управляемом мире.

2 голосов
/ 04 мая 2009

Ваш лучший вариант, вероятно, - вставить требуемый код трассировки в соответствующие методы. Таким образом, вы можете присоединить слушателей трассировки и вывести значения при необходимости.

Я знаю, что это не то, что вы просите, но это один из способов получить данные.

Кроме того, вы можете отладить приложение с помощью WinDbg. Команды! Clstack /! Dso позволяют вам проверять параметры и составлять объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...