Frage

Wenn C / C ++ Code zu schreiben, um die ausführbare Binärdatei die Debug-Option zu debuggen muß auf dem Compiler / Linker aktiviert werden. Im Fall von GCC wird die Option -g. Wenn die Debug-Option aktiviert ist, wie wirkt sich das die ausführbare Binärdatei? Welche zusätzlichen Daten werden in der Datei gespeichert, die den Debugger-Funktion ermöglicht, wie es funktioniert?

War es hilfreich?

Lösung

-g teilt den Compiler zu speichern Symboltabelle Informationen in der ausführbaren Datei. Unter anderem gehören dazu:

  • Symbolnamen
  • Typ-Infos für Symbole
  • Dateien und Zeilennummern, wobei die Symbole kamen aus

Debuggers verwenden diese Informationen zur Ausgabe aussagekräftiger Namen für Symbole und Anweisungen mit bestimmten Linien in der Quelle zu verbinden.

Für einige Compiler liefert wird -g bestimmte Optimierungen deaktivieren. Zum Beispiel icc legt die Standardoptimierungsstufe mit -g -O0 wenn Sie nicht ausdrücklich -O [123] anzuzeigen. Auch wenn Sie tun liefern -O [123], Optimierungen, die Stapelverfolgung verhindern noch deaktiviert werden (z Strippen Rahmenzeiger aus Stapelrahmen. Dies hat nur eine geringe Auswirkung auf die Leistung).

Bei einigen Compilern wird -g Optimierungen deaktivieren, die verwirren können, wo Symbole kamen aus (Befehl Neuordnungs, Schleifenentrollen, inlining usw.). Wenn Sie mit der Optimierung debuggen wollen, können Sie mit gcc verwenden -g3 um einige dieser zu umgehen. Zusätzliche Debug-Informationen werden über Makros, Erweiterungen enthalten sein, und Funktionen, die inlined wurden. Dies kann ermöglichen, Debugger und Performance-Tools optimierte Code auf die ursprüngliche Quelle auf der Karte, aber es ist am besten Aufwand. Einige Optimierungen wirklich den Code mangle.

Für weitere Informationen, werfen Sie einen Blick auf ZWERG , das Debug-Format ursprünglich mitgehen mit ELF (Binärformat für Linux und andere Betriebssysteme).

Andere Tipps

Eine Symboltabelle wird an die ausführbare Datei hinzugefügt, die zu Datenstellen Funktion / Variablennamen abbildet, so dass Debugger können aussagekräftige Informationen berichten, anstatt nur Zeiger. Dies schließt nicht die Geschwindigkeit Ihres Programms bewirken, und Sie können die Symboltabelle mit dem ‚Strip‘ Befehl entfernen.

Neben dem Debuggen und Symbolinformationen
Google ZWERG (A Entwickler Witz auf ELF)

Standardmäßig die meisten Compiler-Optimierungen werden ausgeschaltet, wenn aktiviert ist Debuggen.
So ist der Code ist die reine Übersetzung der Quelle in Maschinencode anstatt das Ergebnis von vielen hoch spezialisierten Transformationen, die angewendet werden Binärdateien veröffentlichen.

Aber der wichtigste Unterschied (meiner Meinung nach)
Speicher in Debug-Builds ist in der Regel auf einige Compiler bestimmte Werte initialisiert das Debuggen zu erleichtern. In Release-Builds, sofern nicht ausdrücklich nicht initialisierten Speicher so durch den Anwendungscode durchgeführt wird.

Überprüfen Sie die Compiler-Dokumentation für weitere Informationen:
Aber ein Beispiel für DevStudio ist:

  
      
  • 0xCDCDCDCD in Heap, aber nicht initialisiert
  •   
  • 0xDDDDDDDD freigegeben Heap-Speicher.
  •   
  • 0xFDFDFDFD „Nomansland“ Zäune automatisch an der Grenze des Heap-Speichers platziert. Sollte nie überschrieben werden. Wenn Sie eines tun überschreiben, sind Sie wahrscheinlich das Ende eines Arrays zu Fuß aus.
  •   
  • 0xCCCCCCCC auf Stapel reserviert, aber nicht initialisiert
  •   

-g fügt in den ausführbaren Debug-Informationen, wie zum Beispiel der Namen von Variablen, die Namen von Funktionen und Zeilennummern. Dies ermöglicht einen Debugger, wie GDB durch Code zeilen zu Schritt Haltepunkte und die Werte der Variablen zu untersuchen. Aufgrund dieser zusätzlichen Informationen mit -g erhöht die Größe der ausführbaren Datei.

Auch ermöglicht gcc zusammen zu verwenden -g mit -O-Flags, die auf Optimierung drehen. eine optimierte ausführbare Debuggen kann sehr schwierig sein, da Variablen weg optimiert werden können, oder Befehle können in einer anderen Reihenfolge ausgeführt werden. Im Allgemeinen ist es eine gute Idee, die Optimierung auszuschalten, wenn mit -g, obwohl es in vielen langsamen Code führt.

Es gibt einige Überschneidungen mit diesem Frage die das Problem von der anderen Seite abdeckt.

Wie eine Angelegenheit von Interesse, können Sie öffnen einen Hexeditor knacken und einen Blick auf eine ausführbare Datei mit -g und eine ohne produziert nehmen. Sie können die Symbole und Dinge sehen, die hinzugefügt werden. Er kann die Baugruppe (-S) ändern, aber ich bin mir nicht sicher.

Einige Betriebssysteme (wie z / OS ) erzeugen eine "Seite-Datei" dass enthält die Debug-Symbole. So wird vermieden, die ausführbare Datei mit zusätzlichen Informationen Blähungen.

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