2009-04-27 10 views
1

Ich bin auf der Suche nach einer Methode, um ein laufendes Programm zu überwachen, dass ich den Quellcode habe. Grundsätzlich, wenn der Benutzer es ausführt, muss ich wissen, welche Funktionen und Parameter nacheinander aufgerufen wird.Wie programmatisch fügen Sie einen Tracepoint für Visual Studio hinzu?

Ich kann einen Trace-Ausgangscode in alle Funktionen schreiben, um dies zu erreichen. Ich bin jedoch nicht berechtigt, den Quellcode zu ändern. Ich habe festgestellt, dass Tracepoint in Visual Studio 2005 mir dies ermöglicht - Protokollinformationen ausgeben, ohne die Quelle zu ändern. Aber ich muss sie zu allen Funktionen hinzufügen.

Da ich Tausende von Dateien und Funktionen habe, muss ich einen Weg finden, dies programmatisch zu tun. Ich habe von DTE.Debugger.Breakpoints.Add erfahren, das in der Lage ist, einen Breakpoint hinzuzufügen. Allerdings konnte ich keinen Tracepoint finden. Oder wo ist die Haltepunkt-Information für ein Projekt gespeichert? Ich konnte es nicht in snn oder vcproj finden. Oder gibt es eine Möglichkeit, Breakpoint programmatisch in Tracepoint zu konvertieren? Ich sehe, dass ich es manuell ändern kann, indem ich den Eigenschaftsdialog "Wenn getroffen" ändere.

Danke!

Antwort

0

Sie könnten sich auch die aspektorientierte Codierung ansehen. Nach meinem Verständnis wird dies die kompilierte Assembly, die durch Attribute gesteuert wird, ändern und wird normalerweise verwendet, um allen Methoden/Eigenschaften Tracing hinzuzufügen.

How can I add a Trace() to every method call in C#?

+0

Ich lese auf AspectC++, während ich an C++ Code arbeite. Es kann auch auf die Argumentwerte zugreifen. Es sollte meinem Zweck gut dienen. Vielen Dank für die Hilfe. – Darren

1

Mit einem .NET Profiler können Sie sehen, welche Methoden ausgeführt werden und wie lange jede dauert, ohne den Quellcode zu ändern. Es injiziert im Grunde speziellen Code in die kompilierte Assembly.

+0

Meinst du eine Leistung oder Speicherprofiler? Ich dachte auch an einen Code Coverage Checker. Aber ich muss auch den Wert der Funktionsparameter/Variablen kennen. Ich denke, dass der Profiler diese Informationen nicht richtig protokollieren kann? Und ich muss auch die Reihenfolge des Funktionsaufrufs wissen - welche Funktion zuerst aufgerufen wird. Mit tracepoint kann ich diese kennen. – Darren

+0

Der Performance-Profiler, den ich derzeit verwende (von EQUATEC), erlaubt mir, in der Reihenfolge, in der sie aufgerufen wurden, auf bestimmte Methoden hinzuweisen. Was die Parameter angeht, die an die einzelnen Methoden übergeben werden, bin ich mir nicht sicher. Ich hatte so etwas wirklich nicht nötig. Tut mir leid, ich könnte nicht mehr helfen. –

0

Erster Teil der Lösung:

DTE.ExecuteCommand ("EditorContextMenus.CodeWindow.Breakpoint.InsertTracepoint")

Es öffnet sich das TP-Fenster für die Zeile, in der sich der Cursor war. Sie müssen jedoch immer noch Return drücken, um OK auszuwählen. Genug für meine Bedürfnisse - zumindest müssen Sie nicht mit der rechten Maustaste klicken, etc.

0

Ich denke, das ist die Lösung ... dieses Makro fügt einen Breakpoint die Main-Methode Ihres Programms, und dann alle Breakpoints in Verfolgungspunkte.

Sub AddBreakpointToMain() 
    Dim bp As EnvDTE80.Breakpoint2 
    Dim bps As EnvDTE.Breakpoints 


    bps = DTE.Debugger.Breakpoints.Add("Main") 
    For Each bp In bps 
     bp.Tag = "SetByMacro" 
     bp.BreakWhenHit = False 
     bp.Message = "Hi, this is your tracepoint calling." 
    Next 
End Sub 
4

Sie sollten Ihre Haltepunkte in EnvDTE80.Breakpoint2 umwandeln. Dann können Sie verwenden

breakpoint.BreakWhenHit = false; 
breakpoint.Macro = "YourMacro"; 
Verwandte Themen