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

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

12 голосов | спросил usman shaheen 12 FriEurope/Moscow2008-12-12T10:36:52+03:00Europe/Moscow12bEurope/MoscowFri, 12 Dec 2008 10:36:52 +0300 2008, 10:36:52

4 ответа


0

Ответ: Использование 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);
        }
    }
}
ответил usman shaheen 17 WedEurope/Moscow2008-12-17T11:00:49+03:00Europe/Moscow12bEurope/MoscowWed, 17 Dec 2008 11:00:49 +0300 2008, 11:00:49
0

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

ответил Jon Skeet 12 FriEurope/Moscow2008-12-12T10:47:30+03:00Europe/Moscow12bEurope/MoscowFri, 12 Dec 2008 10:47:30 +0300 2008, 10:47:30
0

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

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

ответил Brian Rasmussen 12 FriEurope/Moscow2008-12-12T11:24:35+03:00Europe/Moscow12bEurope/MoscowFri, 12 Dec 2008 11:24:35 +0300 2008, 11:24:35
0

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

ответил 1800 INFORMATION 12 FriEurope/Moscow2008-12-12T11:28:01+03:00Europe/Moscow12bEurope/MoscowFri, 12 Dec 2008 11:28:01 +0300 2008, 11:28:01

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132