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

Как отслеживать все локальные переменные при возникновении исключения

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

4b9b3361

Ответ 1

Ответ. Используя PostSharp (Policy Injection), атрибут 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);
        }
    }
}

Ответ 2

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

Ответ 3

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

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

Ответ 4

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