usuario - try catch c#
Cómo rastrear todas las variables locales cuando se produce una excepción (4)
No puedes, básicamente. Reflection le permite obtener variables de instancias (y 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.
¿Hay alguna manera genérica de rastrear / registrar valores de todas las variables locales cuando se produce una excepción en un método? (en C # 3)
Podría hacer un volcado de memoria del proceso, ya que captura los montones y las pilas, pero como etiquetó la pregunta como registro, 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.
Use MiniDumpWriteDump para crear un volcado de memoria del proceso en el punto de la excepción. Tendría que P / invocarlo.
Respuesta: Usando PostSharp (Inyección de política), atributo XTraceMethodBoundary, anula OnException. esto registra todos los tipos y valores de parámetros de entrada y retorno de métodos. 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);
}
}
}