Ich schreibe eine Debugger-Erweiterung VSPackage, in dem ich eine Anweisung im debugged-Prozess ausführen möchte, wenn ein Haltepunkt erreicht wird. In meinem Dateisuffix habe ich dies:Kann keine Anweisung mit VS Debugger Interop ausführen
void Initialize()
{
// ...standard vspackage init code omitted...
Globals.Init((DTE2)GetService(typeof(DTE)));
Globals.DebuggerEvents.OnEnterBreakMode += (dbgEventReason reason, ref dbgExecutionAction action) =>
{
try
{
var e1 = Globals.Application.Debugger.GetExpression("1+2");
Debug.WriteLine(e1.Value); // Prints "3"
Globals.Application.Debugger.ExecuteStatement("x = 1+2", 1000);
Debug.WriteLine("OK"); // Never prints this
}
catch (Exception ex)
{
Debug.WriteLine("Error: "+ex); // Nor this
}
}
}
Beim Debuggen dieser Erweiterung in einer VS-Instanz suchen, wie dies Ich
static void Main()
{
int x = 5;
Console.WriteLine("X is "+x); // Breakpoint on this line
}
Wenn der Haltepunkt in dem debuggt Prozess getroffen wird der Handler ein triviales Programm laden ist aufgerufen und das Ausgabefenster für die Erweiterung zeigt "3", so dass die Auswertung Ausdrücke funktioniert, aber es gelingt nie die Anweisung auszuführen. Es wird nichts mehr in das Ausgabefenster gedruckt. Es gibt keine Ausnahme oder Zeitüberschreitung, und ich kann den Prozess nicht weiter debuggen, der Debugger scheint abgestürzt zu sein.
Die Globals-Klasse hält nur die DTE und DebuggerEvents
public static class Globals
{
public static void Init(DTE2 dte)
{
Application = dte;
DebuggerEvents = dte.Events.DebuggerEvents;
}
public static DTE2 Application { get; private set; }
public static DebuggerEvents DebuggerEvents { get; private set; }
}
Was ich tue, falsch, oder Missverständnis hier?
Das Beste, was hier angenommen wird, ist, dass die Debugger-Engine noch nicht in einem Zustand ist, in dem sie Befehle empfangen kann. Standard-Trick ist es später mit einem Timer oder, sagen wir, ThreadPool.QueueUserWorkItem(), so dass es später passiert. –
Verzögert es etwas, wird es manchmal einen Ausdruck ausführen. Ich habe das Gefühl, dass sie es durch erneutes Eingeben des Handlers töten könnte, als ob ExecuteStatement sofort OnEnterBreakMode auslöst (das könnte erklären, warum nichts passiert, wenn Sie es nicht etwas verzögern). –