2009-08-08 5 views
0

Wenn ich hinzufügen, sagen wir 1 Zeile am Anfang einer Methode, wenn ich einen Haltepunkt durch Visual Studio in der ersten Zeile festlegen, wird es auf die erste Zeile oder die zweite zeigen? Wenn es die falsche Zeile markiert, können wir etwas tun, wenn .exe-Dateien bearbeitet werden, um später eine normale Debugsitzung sicherzustellen?Was passiert, wenn wir Zeilen zu IL-Code hinzufügen und Haltepunkte zu unserem Programm hinzufügen?

Gibt es nicht so etwas wie das Setzen der Linie x auf Y? Ich erinnere mich, irgendwo so etwas gesehen zu haben, nicht sicher, ob es sich um .NET handelt oder nicht.

+4

Warum versuchst du es nicht einfach und siehst es? – Christopher

Antwort

3

Sie müssen die Debugging-Symbole in der PDB-Datei aktualisieren, wenn das Debugging unverändert bleiben soll.

Die beste Option, die ich gesehen habe, ist die Verwendung von Mono.Cecil, da es (begrenzte) Modifikation der Debugging-Symbole sowie der IL unterstützt.

+0

Danke für die Antwort. Ich benutze Cecil, durch Zufall können Sie mir zeigen, wie man diese Modifizierung von Debugging-Symbolen durchläuft? –

+0

Schauen Sie sich die FAQ an: http://www.mono-project.com/Cecil:FAQ Soweit ich mich erinnere, ist es möglich, dass der Montagearbeiter auch die PDB-Datei lädt. In diesem Fall denke ich, dass die möglichen Änderungen automatisch durchgeführt werden . –

2

Wenn Sie IL ändern, enthalten die PDB-Dateien veraltete Informationen. Beachten Sie, dass zwischen Änderungen in IL-Zeilen zu den C# -Zeilen # 1 (1) wahrscheinlich kein 1: 1 vorhanden sein wird (z. B. das Einfügen von 3 IL-Anweisungen wird den IDE-Haltepunkt nicht um 3 Zeilen von C# versetzen).

Sie können die IL-modifizierten Teile Ihres Codes in separate Methoden aufteilen, um die Auswirkungen zu minimieren. Angenommen, Sie sind derjenige, der die IL-Änderung vornimmt, können Sie möglicherweise während des Debuggens zwischen den C# & AWL-Ansichten wechseln.

Sie müssen möglicherweise etwas mit dem generierten Code mucken, um dies zu erleichtern. Wenn sich die injizierte AWL beispielsweise in einer Wrapper-Methode befinden kann, könnten Sie den Debugger anweisen, sie durch Verwendung von attributes wie DebuggerStepThroughAttribute, DebuggerNonUserCodeAttribute oder DebuggerHiddenAttribute zu ignorieren. (Schlagen Sie in der Dokumentation nach den Nuancen im Verhalten nach)

+0

Ich weiß, dass es keine direkte Korrespondenz gibt. Ich möchte nur den Code ignorieren, den ich auf die kompilierte exe setze. Das heißt, wenn ich am Anfang der Methode 10 IL-Zeilen einfüge, möchte ich, dass der Debugger Zeile 11 wie die erste berücksichtigt. –

+0

Sie müssen möglicherweise etwas mit dem generierten Code mucken, um dies zu erleichtern. Wenn sich die injizierte AWL beispielsweise in einer Wrapper-Methode befinden kann, könnten Sie den Debugger anweisen, sie durch Verwendung von attributes wie DebuggerStepThroughAttribute, DebuggerNonUserCodeAttribute oder DebuggerHiddenAttribute zu ignorieren. (Schauen Sie sich die Dokumentation für die Nuancen im Verhalten an). – Addys

+0

Ich habe den Vorschlag auch der Antwort selbst hinzugefügt – Addys

1

Ich erwarte, dass Sie markiert werden, da PDB-Datei möglicherweise nicht übereinstimmt.

0

Wie fügen Sie die IL hinzu? Wenn Sie dies über die Profiler-Instrumentierung (SetILFunctionBody) tun, müssen Sie auch eine neue IL-Codezuordnung (SetILInstrumentation- tionCodeMap) bereitstellen, damit der Debugger auf die IL-Änderung aufmerksam wird.

+0

Ich mache es durch cecil –