Как отследить все локальные переменные при возникновении исключения - PullRequest
12 голосов
/ 12 декабря 2008

какой-нибудь общий способ отследить / зарегистрировать значения всех локальных переменных, когда в методе возникает исключение? (в C # 3)

Ответы [ 4 ]

9 голосов
/ 17 декабря 2008

Ответ. Используя PostSharp (внедрение политики), атрибут XTraceMethodBoundary, переопределите OnException. в нем записываются все типы и значения параметров ввода и возврата метода. Я изменил PostSharp, чтобы добавить простой метод для регистрации параметров. не идеально, но достаточно хорошо

private static void TraceMethodArguments(MethodExecutionEventArgs eventArgs)
{
    object[] parameters = eventArgs.GetReadOnlyArgumentArray();

    if (parameters != null)
    {
        string paramValue = null;
        foreach (object p in parameters)
        {
            Type _type = p.GetType();
            if (_type == typeof(string) || _type == typeof(int) || _type == typeof(double) || _type == typeof(decimal))
            {
                paramValue = (string)p;
            }
            else if (_type == typeof(XmlDocument))
            {
                paramValue = ((XmlDocument)p).OuterXml;
            }
            else
            { //try to serialize
                try
                {
                    XmlSerializer _serializer = new XmlSerializer(p.GetType());
                    StringWriter _strWriter = new StringWriter();

                    _serializer.Serialize(_strWriter, p);
                    paramValue = _strWriter.ToString();
                }
                catch
                {
                    paramValue = "Unable to Serialize Parameter";
                }
            }
            Trace.TraceInformation("[" + Process.GetCurrentProcess().Id + "-" + Thread.CurrentThread.ManagedThreadId.ToString() + "]" + " Parameter: " + paramValue);
        }
    }
}
8 голосов
/ 12 декабря 2008

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

4 голосов
/ 12 декабря 2008

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

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

2 голосов
/ 12 декабря 2008

Используйте MiniDumpWriteDump , чтобы создать дамп памяти процесса в точке исключения. Вы должны P / Invoke это.

...