Wie WinDbg in einer anonymen Methode zu brechen?

8

Titel sagt irgendwie alles. Der übliche SOS-Befehl ! Bpmd ist ohne Namen nicht gut.

Einige Ideen, die ich hatte:

  • dump jede Methode, dann verwenden Sie ! bpmd -md , wenn Sie den entsprechenden MethodDesc finden
    • nicht praktikabel in der realen Welt, von dem, was ich sagen kann. Selbst wenn ich ein Makro geschrieben habe, um den Speicherauszug auf anonyme Typen / Methoden zu beschränken, gibt es keinen offensichtlichen Weg, sie auseinander zu halten.
  • Verwenden Sie Reflector, um den MSIL-Namen auszugeben
    • hilft nicht beim Umgang mit dynamischen Assemblys und / oder Reflection.Emit. Visual Studio's Unfähigkeit, lokale Vars in solchen Szenarien zu lesen, ist der Hauptgrund, warum ich mich überhaupt an Windbg gewandt habe ...
  • setze den Haltepunkt in VS, warte, bis er getroffen wird, dann wechsele mit Windbg der nichtinvasive Trick
    • Der Versuch, sich von VS zu trennen, führt dazu, dass es (zusammen mit der App) hängen bleibt. Ich denke, das liegt an der Tatsache, dass der verwaltete Debugger ein "weicher" Debugger via thread ist injection anstelle eines standardmäßigen "harten" Debuggers. Oder vielleicht ist es nur ein VS-Bug, der für Silverlight spezifisch ist (wäre kaum der erste Ich bin getroffen ).
  • Setzen Sie einen Haltepunkt an einem anderen Ort, von dem bekannt ist, dass er die anonyme Methode aufruft, und gehen Sie dann einen Schritt weiter
    • mein Backup-Plan, obwohl ich lieber nicht darauf zurückgreifen würde, wenn dieser Q & A-Code einen besseren Weg zeigt
Richard Berg 12.03.2010, 06:33
quelle

3 Antworten

9

Die anonyme Methode ist nicht wirklich anonym. Es verbirgt sich einfach hinter einem vom Compiler erzeugten Namen.

Betrachten Sie dieses kleine Beispiel:

%Vor%

Um den Rückgabewert zu finden, müssen wir den Namen der Methodenimplementierung finden. Dazu müssen wir den MethodDesc der umgebenden Methode lokalisieren. In diesem Beispiel ist Main() , also:

%Vor%

Über den MethodDesc können wir die IL für Main()

ausgeben %Vor%

Beachten Sie die lustig aussehenden Namen. Sie sind die Namen des generate-Delegate-Typs und der tatsächlichen Methode. Die Methode heißt <Main>b__0 . Schauen wir uns die Methode an:

%Vor%

Da hast du es. MethodDesc ist 00153024 und wie der Kommentar sagt, können Sie mit! Bpmd den Haltepunkt mithilfe von MethodDesc festlegen.

    
Brian Rasmussen 12.03.2010, 20:01
quelle
0

Wenn es für Ihr Szenario schwierig ist, den Namen "& lt; & gt; ...." zu finden, wie wäre es mit einer normalen Methode? Dies ist normalerweise sehr einfach; Das Einzige, was am schwierigsten ist, sind erfasste Variablen, aber das ist nicht so schlimm - zum Beispiel machen sie dasselbe:

%Vor%     
Marc Gravell 12.03.2010 07:08
quelle
0

Geben Sie den Methodendeskriptor aus, auf den die Aktion verweist. Wegbeschreibung hier .

    
Igor Dvorkin 09.12.2012 14:52
quelle