¿Hay alguna forma genérica de rastrear/registrar valores de todas las variables locales cuando se produce una excepción en un método? (en C# 3)Cómo rastrear todas las variables locales cuando se produce una excepción
Respuesta
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);
}
}
}
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.
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.
Utilice MiniDumpWriteDump para crear un volcado de memoria del proceso en el punto de la excepción. Tendría que P/invocarlo.
- 1. acceso todas las variables locales
- 2. Imprimir todas las variables globales/variables locales?
- 3. Java ¿cómo imprimir todas las variables locales?
- 4. ¿Cómo se destruyen las variables locales cuando sale un bloque normalmente llamado en C++?
- 5. ¿Cómo se definen las variables estáticas locales locales de subprocesos?
- 6. Destructor no llama cuando se produce una excepción
- 7. $ excepción se define en "locales"
- 8. PHP: Cómo volcar todas las variables locales en un manejador de excepciones
- 9. Cómo acceder a las variables locales dinámicas
- 10. cuando corro prueba Mockito se produce WrongTypeOfReturnValue Excepción
- 11. ¿Cómo se leen las variables locales con gdb?
- 12. ¿Cómo declarar las variables locales en postgresql?
- 13. ¿Cómo se enumeran las variables locales en Ruby?
- 14. Las variables locales en las definiciones de clase/ámbito
- 15. ¿Cuándo se asigna espacio de pila para las variables locales?
- 16. rastrear variables estáticas no inicializadas
- 17. las variables Constructor-locales en Scala
- 18. Cómo crear un minivolcado de un proceso .NET cuando se produce una excepción de primera oportunidad
- 19. Cómo liberar memoria cuando se produce una excepción fuera de la memoria en Delphi usando SetLength
- 20. Python: prueba que se realiza correctamente cuando no se produce una excepción
- 21. Spring Batch SkipListener no se llama cuando se produce una excepción en el lector
- 22. ¿Cómo forzo al compilador de C# a lanzar una excepción cuando cualquier operación matemática produce 'NaN'?
- 23. ¿Cómo sabe el compilador mover las variables locales?
- 24. ¿Dónde se almacenan las variables locales finales de Java?
- 25. referencia colapso para las variables locales
- 26. ¿Cómo enumero todas las variables locales dentro de un método/función de Java?
- 27. Salto cuando se lanza una excepción
- 28. ¿Cómo puedo cargar todas las claves de un dict como variables locales, un mejor enfoque?
- 29. ¿Dónde se almacenan las variables locales de .NET?
- 30. Redirigir asp.net mvc si se produce una excepción personalizada