Подтвердить что ты не робот

Как получить текущие значения locals и параметров в стеке?

В приложении .NET у меня есть некоторые моменты, когда мне нужно собрать некоторую отладочную информацию о текущем состоянии потока. Я могу получить некоторую информацию new StackTrace() constructor. В частности, я могу получить список текущих кадров стека, включая соответствующие объекты MethodInfo, которые могут предоставить мне код IL, количество локальных переменных и параметров и имена параметров.

Как я могу получить текущие значения этих локалей и параметров (по крайней мере, из примитивных типов)?

Я не могу вручную подключать отладчики к приложению, но при необходимости приложение может создавать новые процессы.

4b9b3361

Ответ 1

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

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

Важно то, что на каждой архитектуре .NET после запуска сборки выполняется "дрожание" и преобразует ваш код IL в собственный код; В результате загружается в память чистый машинный код, который вы не можете легко взломать для получения значений (хотя теоретически это возможно). Еще один момент, упомянутый выше, - это оптимизация - пока они включены, вы можете ожидать, что методы исчезнут (будучи встроенными), порядок выполнения может быть изменен, а переменные заменены литералами. Компилятор делает много вещей, чтобы ваш код работал быстрее.


Хотя я не вижу хорошего решения для получения значений locals во время выполнения, я думаю, что есть способы получить значение параметров с помощью методов перехвата. Посмотрите, что PostSharp может сделать для вас.

Ответ 2

Можете ли вы записать значения своих переменных в консоль или в файл журнала?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable);
Console.WriteLine("Value of my variable: "+myvariable);

Ответ 3

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

MethodImplOptions.NoInlining

Обычно для другой локальной информации вы используете логгер для db или плоского файла или что-то в этом роде.

Ответ 4

Ведение журнала должно быть довольно простым. Либо создайте файл журнала, либо создайте WriteLine().

Эта документация может помочь: http://msdn.microsoft.com/en-us/library/tss153kw.aspx

Ответ 5

Отличный выбор - использовать Postsharp. Он основан на программно-ориентированном программировании и вводе кода. Это позволяет вам принимать значения параметров в методе.

Возможно, вы сможете решить часть своих потребностей.