2016-05-16 9 views
1

Ich bin gespannt, ob es möglich ist, Operationen unter Objektreferenzen während der Laufzeit zu verfolgen (Kopieren, Zugriff usw.). Zum Beispiel, wenn ich debuggen den folgenden Code:Objektreferenzverfolgung in Runtime

private static void Main(string[] args) 
{ 
    // Creating new object and reference. 
    var myList = new List<int>(); 
    // a) Copying a reference to method. 
    UpdateList(myList); 
}    

private static void UpdateList(IList<int> list) 
{ 
    // b) Copying the reference. 
    var localList = list; 

    // c) Accessing the object through copied reference. 
    localList.Add(1); 
    // d) Copying a reference to method. 
    int count = GetListElementsCount(localList); 
} 

private static int GetListElementsCount(IList<int> list) 
{ 
    // Another reference access. 
    // Breakpoint here. 
    return list.Count; 
} 

und einen Haltepunkt in GetListElementsCount setzen, kann ich schauen Sie durch das list Argument Ursprung und ihm vorgenommenen Änderungen (a, b, c, d)? Bietet Roslyn-Compiler einige C# API dafür?

Vielen Dank.

+0

http: //source.roslyn. io/# Microsoft.CodeAnalysis/Kompilierung/DataFlowAnalysis.cs – SLaks

Antwort

0

In Visual Studio Enterprise gibt es eine Funktion namens Historical Debugging. Mit einigen limitations (sammelt Variablen nur in Autos und Local Windows) bietet es die Möglichkeit, auf Variablenhistorie ohne tatsächliche Code-Neuausführung zu sehen.

0

Es hängt sehr von Ihren spezifischen Bedürfnissen ab.

Sie können die DataFlowAnalysis als SLaks Kommentar überprüfen, wenn es Ihren Bedürfnissen entspricht.

Oder natürlich können Sie die einfache naive Option verwenden, Protokollierung vor \ nach jeder relevanten Operation verwenden.

Wenn diese beiden Optionen nicht ausreichen, können Sie es mit Instrumentierung versuchen zu tun, indem sie jeden Schöpfung Einwickeln \ get \ gesetzt usw.

Instrumentation kann wie StaticProxy.Fody oder dynamisch (Castle, Linfu, Sprint.Net etc statisch sein .).

Andere Art der Instrumentierung ist Instant Projekt. Es verwendet NRefactory, aber Sie können es leicht konvertieren, um Roslyn zu verwenden.

Nachdem Sie Informationen über Ihr Laufzeitverhalten haben, können Sie es verwenden, wie Sie möchten.

Nachdem Sie alle Objektänderungen in einer Datenstruktur gespeichert und die Methode GetListElementsCount in Ihrem Beispiel gespeichert haben, können Sie Ihre Datenstruktur untersuchen und nach einer bestimmten Operation fragen.

Ihre Datenstruktur kann (nur für sehr einfaches Beispiel) sein: Wörterbuch wo Schlüssel ist der Name der Operation und Wert ist der neue Wert, nachdem die Operation ausgeführt wird.

Zur Erstellung: key = "Schöpfung", Wert = Liste

Für Aufruf list.Add (1): key = Methodenaufruf - Hinzufügen, Wert = 1