RedGate имеет инструмент сообщения об ошибке, который говорит, что может
"Получите полное состояние своей программы, когда она отказала (не только отслеживание стека), включая значения переменных, когда катастрофический отказ произошел – не имея необходимость идти назад и вперед в неэффективных почтовых переговорах с конечным пользователем".
Я создал инструмент создания отчетов необработанного исключения наши приложения, но я не могу вообразить, как они получают больше, чем информация трассировки стека в производственном коде.
У кого-либо есть какие-либо идеи?
Похоже, что они переписывают вашу сборку и добавляют блок 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;
}
Довольно сложно ... Итак, он покажет значение параметров и локальные переменные В ВРЕМЯ возникновения исключения.
Я не знаю подробностей, но Microsoft предоставляет отладочные API и специальную отладочную DLL под названием SOS для программ .NET. Возможно, RedGate использует такие API отладки для проверки локальных переменных и других программных «корней». Теоретически он может использовать отладочные API-интерфейсы для захвата состояния всех существующих объектов в то время, когда обнаруживается, что исключение / сбой не обрабатывается.
Локальные переменные хранятся в стеке (так же, как и параметры).
Хорошо, там написаны локальные переменные? Об этом не говорится в цитированной вами статье. Я подозреваю, что он делает дамп кучи и позволяет вам проверять статические переменные и переменные экземпляра.
Сказав это, я полагаю, что они могли установить своего рода глобальный обработчик ошибок (есть фильтры исключений, которые выполняются даже до блока catch или finally), который захватывает содержимое стека с помощью собственного кода. Это может дать доступ к локальным переменным.
В принципе, если ему удастся захватить стек до того, как он развернется (как бы они это ни сделали), они могут получить доступ к вашим локальным переменным. Если код RedGate задействуется только тогда, когда он достигает верхнего уровня, я подозреваю, что это будут только значения кучи.
Вы пробовали этот продукт на себе? Не могли бы вы дать ссылку на это?
Они говорят не об обработчике исключений, а о чем-то, что вмешивается в момент, когда исключение брошено.
Вероятно, они делают аварийный дамп, который включает всю программную память и все значения регистров, а также большое количество метаданных. Это действительно позволяет вам восстановить все о состоянии вашей программы после сбоя.
Я не уверен, как RedGate это делает, но Visual Studio 2010 представила новую функцию под названием IntelliTrace , которая делает что-то похожее ...... возможно, она основана на что?
Это невозможно с чистым управляемым кодом. Вы можете сделать это, используя отладочный API. Возможно, это поможет http://msdn.microsoft.com/en-us/library/bb384652(VS.90).aspx