Eine allgemeine Möglichkeit, Werte aller lokalen Variablen zu verfolgen/zu protokollieren, wenn eine Ausnahme in einer Methode auftritt? (in C# 3)
Antworten
Zu viele Anzeigen?Antwort: Verwendung von PostSharp (Policy Injection), XTraceMethodBoundary-Attribut, Überschreiben von OnException . Dies protokolliert alle Typen und Werte der Eingabe- und Rückgabeparameter der Methode. Ich habe PostSharp geändert, um eine einfache Methode zum Protokollieren von Parametern hinzuzufügen. nicht perfekt, aber gut genug
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);
}
}
}
Im Grunde kann man das nicht. Durch Reflexion kann man an Instanz (und statische) Variablen, aber wenn Sie lokale Variablen protokollieren wollen, müssen Sie dies explizit tun. Es ist möglich, dass Sie mit der Profiling-API etwas Besseres erreichen können, aber das wäre ein ziemlich extremer Schritt.
Sie könnten einen Speicherabzug des Prozesses machen, da dieser sowohl die Heaps als auch die Stacks erfasst, aber da Sie die Frage als Protokollierung gekennzeichnet haben, nehme ich an, dass dies nicht das ist, wonach Sie suchen.
Sie können jedoch den Bedarf an diesen Informationen verringern, indem Sie sicherstellen, dass Ihre Methoden immer kurz und bündig sind. So erhalten Sie viel nützlichere Stack Traces und die Anzahl der zu untersuchenden Locals wird begrenzt.
Utilice MiniDumpWriteDump um einen Speicherauszug des Prozesses zum Zeitpunkt der Ausnahme zu erstellen. Sie müssen ihn mit P/Invoke aufrufen.