Значения локальных переменных в C# после исключения?

RedGate имеет инструмент сообщения об ошибке, который говорит, что может

"Получите полное состояние своей программы, когда она отказала (не только отслеживание стека), включая значения переменных, когда катастрофический отказ произошел – не имея необходимость идти назад и вперед в неэффективных почтовых переговорах с конечным пользователем".

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

У кого-либо есть какие-либо идеи?

11
задан ConsultUtah 24 June 2010 в 16:40
поделиться

8 ответов

Похоже, что они переписывают вашу сборку и добавляют блок try / catch в каждый метод (кроме тех, которые вы специально исключили). Уловка получает значение всех локальных переменных. Итак, если бы у меня был код:

private int Add(int o1, int o2) {
  return o1+o2;
}

Он бы изменил его примерно так:

private int Add(int o1, int o2) {
  int ret = 0;
  try {
    ret = o1+o2;
  }
  catch (Exception e) {
    SpecialExceptionHandler.HandleException(e, new object[]{o1, o2});
  }
  return ret;
}

Довольно сложно ... Итак, он покажет значение параметров и локальные переменные В ВРЕМЯ возникновения исключения.

15
ответ дан 3 December 2019 в 05:56
поделиться

Я не знаю подробностей, но Microsoft предоставляет отладочные API и специальную отладочную DLL под названием SOS для программ .NET. Возможно, RedGate использует такие API отладки для проверки локальных переменных и других программных «корней». Теоретически он может использовать отладочные API-интерфейсы для захвата состояния всех существующих объектов в то время, когда обнаруживается, что исключение / сбой не обрабатывается.

0
ответ дан 3 December 2019 в 05:56
поделиться

Локальные переменные хранятся в стеке (так же, как и параметры).

-2
ответ дан 3 December 2019 в 05:56
поделиться

Хорошо, там написаны локальные переменные? Об этом не говорится в цитированной вами статье. Я подозреваю, что он делает дамп кучи и позволяет вам проверять статические переменные и переменные экземпляра.

Сказав это, я полагаю, что они могли установить своего рода глобальный обработчик ошибок (есть фильтры исключений, которые выполняются даже до блока catch или finally), который захватывает содержимое стека с помощью собственного кода. Это может дать доступ к локальным переменным.

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

Вы пробовали этот продукт на себе? Не могли бы вы дать ссылку на это?

5
ответ дан 3 December 2019 в 05:56
поделиться

Они говорят не об обработчике исключений, а о чем-то, что вмешивается в момент, когда исключение брошено.

2
ответ дан 3 December 2019 в 05:56
поделиться

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

0
ответ дан 3 December 2019 в 05:56
поделиться

Я не уверен, как RedGate это делает, но Visual Studio 2010 представила новую функцию под названием IntelliTrace , которая делает что-то похожее ...... возможно, она основана на что?

0
ответ дан 3 December 2019 в 05:56
поделиться

Это невозможно с чистым управляемым кодом. Вы можете сделать это, используя отладочный API. Возможно, это поможет http://msdn.microsoft.com/en-us/library/bb384652(VS.90).aspx

0
ответ дан 3 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: