Frage

Ist es möglich, für den Debugger (oder die CLR Exception-Handler) die Zeile zu zeigen, wo die Ausnahme in Release-Modus passierte das PDB mit?

Der Code, im Release-Modus, optimiert ist und nicht immer die Ordnung und die Logik des „Original“ Code folgen.

Es ist auch überraschend, dass der Debugger durch meinen Code Schritt für Schritt navigieren kann, auch in Release-Modus. Die Optimierung sollte die Navigation sehr inconfortable machen.

Könnten Sie bitte diese beiden Punkte für mich klären?

War es hilfreich?

Lösung

Ich bin nicht so vertraut, wie dies mit CLR geschehen ist, aber es ist wahrscheinlich sehr ähnlich, wie es mit nativen Code fertig ist. Wenn die Compiler Maschinenbefehle erzeugt, fügt er Einträge in die PDB, die im Grunde sagen „der Befehl an der aktuellen Adresse, X, kam von der Linie 25 in foo.cpp“.

Der Debugger weiß, welche Programmadresse gerade ausgeführt wird. So sieht es eine Adresse, X, in der PDB und sieht, dass es von der Linie 25 in foo.cpp kam. Mit dieser ist es möglich Code zu „Schritt“ durch Ihre Quelle.

Dieses Verfahren ist das gleiche, unabhängig von Debug oder Release-Modus (vorausgesetzt, dass ein pdb überhaupt in Release-Modus erzeugt wird). Sie haben Recht, jedoch, dass aufgrund der Optimierungen im Release-Modus oft der Debugger nicht „linear“ Schritt durch den Code wird. Es könnte unerwartet zu verschiedenen Linien herumspringen. Dies ist aufgrund der Optimierer die Reihenfolge der Befehle zu ändern, aber nicht die Zuordnung Adresse-zu-Source-Linie zu ändern, so dass der Debugger ist noch in der Lage, ihn zu folgen.

Andere Tipps

[@ Nicht sicher] hat es fast richtig. Der Compiler macht einen Best-Effort auf eine entsprechende Zeilennummer identifiziert, die nahe an den aktuellen Maschinencodebefehl.

Der HVE und der Debugger nichts über Optimierungen wissen; die PDB-Datei abbildet im Wesentlichen Adressenstellen in den Maschinencode zu Codezeilennummern Quelle. In optimierten Code, ist es nicht immer möglich, genau eine Montageanleitung zu einer bestimmten Zeile des Quellcodes entsprechen, so wird der Compiler zum HVE schreibt die nächste Sache, die es in der Hand hat. Dies könnte „die Zeile im Quellcode vor“, oder „die Zeile im Quellcode des umschließenden Kontextes (Schleife, etc.)“ sein oder etwas anderes.

Unabhängig davon, findet der Debugger im Wesentlichen der Eintrag in der PDB am nächsten Karte (wie in „vor oder gleich“), um die aktuellen IP (Instruction Pointer) und zeigt diese Zeile.

Manchmal ist das Spiel nicht sehr gut, und das ist, wenn Sie den markierten Bereich sehen ganz über den Platz zu springen.

Der Debugger macht ein Best-Effort erraten, wo das Problem auftrat. Es ist nicht zu 100% garantiert präziseen und mit einem voll optimierten Code, wird es oft ungenau sein. - Ich habe die Ungenauigkeiten im Bereich irgendwo von einigen Linien gefunden off einen völlig falschen Aufruf-Stack mit

Wie genau der Debugger ist mit optimierten Code hängt wirklich von dem Code selbst und die Optimierungen Sie machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top