2008-12-12 8 views

Antwort

9

Antwort: Verwenden Sie PostSharp (Policy Injection), das XTraceMethodBoundary-Attribut, überschreiben Sie OnException. Dies protokolliert alle Methodeneingabe- und Rückgabeparametertypen und -werte. Ich habe PostSharp modifiziert, 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); 
     } 
    } 
} 
7

Sie können nicht, grundsätzlich. Mit Reflection können Sie die Variablen () (und statische Variablen) ermitteln. Wenn Sie jedoch lokale Variablen protokollieren möchten, müssen Sie dies explizit tun. Es ist möglich, dass Sie etwas besser mit der Profiling-API arbeiten könnten, aber das wäre ein ziemlich extremer Schritt.

4

Sie könnten einen Speicherabbild des Prozesses erstellen, da dieser sowohl die Heaps als auch die Stacks erfasst, aber da Sie die Frage als Protokollierung markiert haben, nehme ich an, dass das nicht das ist, wonach Sie suchen.

Sie können jedoch die Notwendigkeit für diese Informationen reduzieren, indem Sie sicherstellen, dass Ihre Methoden immer klein und auf den Punkt sind. Das wird viel nützlichere Stack-Traces ergeben und es wird die Anzahl der Locals einschränken, die inspiziert werden müssen.

2

Verwenden Sie MiniDumpWriteDump zum Erstellen eines Speicherauszugs des Prozesses an der Stelle der Ausnahme. Sie müssten P/Invoke es.

Verwandte Themen