Есть ли простой способ получить все локальные переменные в текущем стеке кадра в C # (или CIL) - PullRequest
7 голосов
/ 28 февраля 2011

Следуя моему предыдущему вопросу, в котором я хотел сбросить все переменные в стеке (из текущего и всего предыдущего кадра), которые можно увидеть здесь: Есть ли способ проверить переменные стека во время выполненияв C #?

мне предложили перехватывать вызовы вручную или использовать инфраструктуру AOP, такую ​​как PostSharp, чтобы упростить такую ​​задачу.Я посмотрел на PostSharp и аргументы перехвата не включают переменные в текущий кадр стека.Интересно, есть ли простой способ автоматически получить все локальные переменные в текущем кадре стека?Я предполагаю, что могу выполнить анализ кода и сгенерировать код, который копирует все эти значения в коллекцию, но, возможно, есть встроенный механизм, который делает это.

Заранее благодарен за любые предложения.

РЕДАКТИРОВАТЬ: Я должен был дать более подробную информацию о том, почему я хочу это сделать.Я хочу иметь возможность приостановить выполнение в середине метода.Если бы у меня было содержимое стека, я мог бы позже возобновить выполнение или даже сериализовать его и продолжить его на другом компьютере (при условии, что это относительно простой код, например, без потоков или ввода-вывода).Можно запустить инструмент анализа кода, который позволил бы мне автоматически генерировать дополнительный код, который сохраняет это состояние.Я думаю, что мне, вероятно, придется проанализировать CIL, чтобы сделать это.

Ответы [ 3 ]

6 голосов
/ 28 февраля 2011
   System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
        System.Diagnostics.StackFrame frame = trace.GetFrame(0);
        MethodBase method = frame.GetMethod();
        MethodBody methodBody = method.GetMethodBody();
        if (methodBody != null)
        {
            foreach (var local in methodBody.LocalVariables)
            {
                Console.WriteLine(local);
            }
        }
        Console.ReadKey();
5 голосов
/ 28 февраля 2011

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

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

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

  • метод может быть встроен (локальные переменные будут объединены с вызывающими методами)
  • локальные переменные могут быть оптимизированы
  • Локальная переменная может выходить из области видимости и собираться мусором до конца метода.
2 голосов
/ 02 декабря 2012

Рассмотрим Запись мини-дампов с использованием пользовательского аспекта PostSharp (с преобразованием IL ).

Общая библиотека движка отладки, написанная на C #.доступен в NuGet как Microsoft.Samples.Debugging.MdbgEngine .

Код доступен на GitHub как часть репозитория PADRE (модуль сменной автоматической отладки и создания отчетов)

...