Frage

Um in der Lage sein, um richtig baut Debug-Release eine PDB-Datei benötigt wird. Kann die PDB-Datei immer weniger brauchbar, wenn die Compiler verschiedene Arten von Optimierungen verwendet (FPO, PGO, intrinsischer Funktionen, inlining etc.)? Wenn ja, ist die Wirkung der Optimierung schwerer oder lediglich benachbarte Codezeilen führen zu verwechseln?

(Ich verwende VC2005 und werden immer debugability über optimierte Leistung wählen - aber die Frage ist allgemein)

War es hilfreich?

Lösung

Ja, optimierte Code ist weniger debug. Nicht nur, dass einige Informationen fehlen, werden einige Informationen sehr irreführend sein.

Das größte Problem ist meiner Meinung nach lokalen Variablen. Der Compiler kann die gleiche Stapeladresse verwenden oder für mehrere Variablen während eines Funktionsregister. Wie andere Plakate erwähnt, herauszufinden, manchmal sogar heraus, was die „this“ Zeiger nehmen ist ein wenig Zeit kann. Wenn Code optimiert Debuggen können Sie die aktuelle Zeile sehen, wie Sie Schritt herumspringen, da der Compiler den generierten Code neu organisiert. Wenn Sie PGO verwenden, um das Springen wird wahrscheinlich nur noch schlimmer.

FPO sollte nicht debuggability beeinflussen zu viel vorausgesetzt, Sie einen PDB haben, da die PDB alle Informationen enthält, die notwendig den Stapel für FPO Rahmen zu entspannen. FPO kann ein Problem sein, wenn die Tools, die Stack-Traces ohne Symbole zu nehmen. Bei vielen Projekten nicht schwerer wiegen als der Perf Nutzen von FPO heute nicht den Hit für Diagnostizierbarkeit; Aus diesem Grunde, MS beschlossen, nicht Windows Vista mit der FPO-Optimierung ( http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx ).

Ich ziehe es nicht optimiert Code zu debuggen, aber dies ist nicht immer möglich - nur einige Probleme mit optimierten Code repro, Kunden Crash-Dumps ist von der Freigabe zu bauen, und privaten Einsatz einer Debug bekommen ist manchmal nicht möglich. Oft, wenn optimierte Code debuggen, verwende ich die Demontage Ansicht - dissasembly nie liegt

.

Dies gilt alle Windbg da ich damit alle nativen Code-Debugging tun. Visual Studio Debugger könnten einige dieser Fälle besser behandeln.

Andere Tipps

Ja. Es kann manchmal schwer sein, aber das ist in der Regel mehr das Ergebnis von inlining oder Umordnung des Codes.

Die lokalen Variablen auch nicht genau im Überwachungsfenster angezeigt werden kann, da sie nur in den Registern vorhanden sein können und nicht korrekt angezeigt werden können, wenn Sie Stack-Frames wechseln.

Die Optimierung kann ernsthaft beeinträchtigt das Debuggen auf jeder Plattform (nicht nur VCs PDB-Dateien).

Genau aus den Gründen, die Sie erwähnt haben, Funktion inlining in einigen Fällen völlig verwirren, welche Befehle gehören zu der Funktion (da manchmal Art sie gehören beide).

Auch eine gemeinsame Optimierung ist "dirty" Stack-Frames (-fomit-frame-pointer in GCC) zu tun, die den Code verursacht, nicht die Spitze des Stapels zu verfolgen. Das ist in Ordnung, es befreit ein zusätzliches Register (EBP auf x86) für andere Operationen auf. Aber es macht es nahezu unmöglich, den Stapel-entspannen, um zu sehen, was wirklich vor sich geht. Es macht es auch fast unmögliche lokale Variablen und Parameter der Funktion auf dem Stapel zu finden.

Generell gilt: Erwarten Sie nicht, nützliche Debug-Informationen aus „release“ zu bekommen baut. Wenn das Debuggen so wichtig ist, auch auf Release, dann sollten Sie sein „Loslassen“ debug bauen statt.

Zusätzlich zu dem lokalen Variablen, der ‚this‘ Zeiger wird in der Regel wegoptimiert in optimierte Builds. Dies kann manchmal durch steigen genug in dem Call-Stack auf den Punkt, um gearbeitet werden, wo das Objekt Zeiger oder eine Referenz existiert als nicht-optimierte-away-Variable.

Im Allgemeinen. Einzelschritt in der Regel in der optimierten Build funktioniert mehr oder weniger und lässt man sehen, welche logische Entscheidungen der Code macht. Die Untersuchung der Daten, auf denen diese Entscheidungen basieren, ist in der Regel viel komplizierter.

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