2008-12-12 21 views

Respuesta

9

Respuesta: El uso de PostSharp (Inyección de política), atributo XTraceMethodBoundary, anula OnException. esto registra todos los tipos y valores de parámetros de entrada y retorno del método. Modifiqué PostSharp para agregar un método simple para registrar parámetros. no es perfecto, pero es lo suficientemente bueno

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); 
     } 
    } 
} 
7

No puedes, básicamente. Reflection le permite obtener instancia (y variables estáticas) pero si desea registrar variables locales, tendrá que hacerlo explícitamente. Es posible que pueda hacer un poco mejor usando la API de creación de perfiles, pero ese sería un paso bastante extremo.

4

Podría hacer un volcado de memoria del proceso ya que captura tanto montones como montones, pero desde que etiquetó la pregunta como logging, supongo que eso no es lo que está buscando.

Sin embargo, puede reducir la necesidad de esta información asegurándose de que sus métodos sean siempre pequeños y al grano. Eso producirá rastros de pila mucho más útiles y limitará el número de locales para inspeccionar.

2

Utilice MiniDumpWriteDump para crear un volcado de memoria del proceso en el punto de la excepción. Tendría que P/invocarlo.

Cuestiones relacionadas