-g weist den Compiler an, Symboltabelleninformationen in der ausführbaren Datei zu speichern. Dazu gehören unter anderem:
- Symbolnamen
- Geben Sie info für Symbole ein
- Dateien und Zeilennummern, aus denen die Symbole stammen
Debugger verwenden diese Informationen, um aussagekräftige Namen für Symbole auszugeben und Anweisungen bestimmten Zeilen in der Quelle zuzuordnen.
Bei einigen Compilern werden durch die Angabe von -g bestimmte Optimierungen deaktiviert. Beispielsweise setzt icc die Standardoptimierungsstufe mit -g auf -O0, sofern Sie nicht ausdrücklich -O [123] angeben. Auch wenn Sie -O [123] angeben, werden Optimierungen, die die Stapelverfolgung verhindern, weiterhin deaktiviert (z. B. Entfernen von Frame-Zeigern von Stack-Frames. Dies hat nur einen geringen Einfluss auf die Leistung).
Bei einigen Compilern deaktiviert -g Optimierungen, die verwirren können, woher Symbole stammen (Neuanordnung von Anweisungen, Abrollen von Schleifen, Inlining usw.). Wenn Sie mit der Optimierung debuggen möchten, können Sie -g3 mit gcc verwenden, um einige davon zu umgehen. Zusätzliche Debug-Informationen zu Makros, Erweiterungen und Funktionen, die möglicherweise eingebunden wurden, werden hinzugefügt. Dies kann es Debuggern und Leistungstools ermöglichen, optimierten Code der ursprünglichen Quelle zuzuordnen, aber es ist die beste Anstrengung. Einige Optimierungen entstellen den Code wirklich.
Weitere Informationen finden Sie in DWARF , dem Debugging-Format, das ursprünglich für ELF (das Binärformat für Linux und andere Betriebssysteme) entwickelt wurde.
Der ausführbaren Datei wird eine Symboltabelle hinzugefügt, die Funktions- / Variablennamen Datenpositionen zuordnet, sodass Debugger aussagekräftige Informationen und nicht nur Zeiger zurückmelden können. Dies wirkt sich nicht auf die Geschwindigkeit Ihres Programms aus, und Sie können die Symboltabelle mit dem Befehl 'strip' entfernen.
quelle
Zusätzlich zu den Debugging- und Symbolinformationen
Google DWARF (Ein Entwicklerwitz auf ELF)
Standardmäßig sind die meisten Compiler-Optimierungen deaktiviert, wenn das Debuggen aktiviert ist.
Der Code ist also eher die reine Übersetzung der Quelle in Maschinencode als das Ergebnis vieler hochspezialisierter Transformationen, die zum Freigeben von Binärdateien angewendet werden.
Der wichtigste Unterschied (meiner Meinung nach) zum
Speicher in Debug-Builds wird jedoch normalerweise auf einige compilerspezifische Werte initialisiert, um das Debuggen zu erleichtern. In Release-Builds wird der Speicher nur initialisiert, wenn der Anwendungscode dies ausdrücklich tut.
Weitere Informationen finden Sie in der Compiler-Dokumentation:
Ein Beispiel für DevStudio ist jedoch:
quelle
-g fügt der ausführbaren Datei Debugging-Informationen hinzu, z. B. die Namen von Variablen, die Namen von Funktionen und Zeilennummern. Auf diese Weise kann ein Debugger wie z. B. gdb Code zeilenweise durchlaufen, Haltepunkte festlegen und die Werte von Variablen überprüfen. Aufgrund dieser zusätzlichen Informationen erhöht die Verwendung von -g die Größe der ausführbaren Datei.
Außerdem ermöglicht gcc die Verwendung von -g zusammen mit -O-Flags, die die Optimierung aktivieren. Das Debuggen einer optimierten ausführbaren Datei kann sehr schwierig sein, da Variablen möglicherweise nicht mehr optimiert werden oder Anweisungen in einer anderen Reihenfolge ausgeführt werden. Im Allgemeinen ist es eine gute Idee, die Optimierung bei Verwendung von -g zu deaktivieren, obwohl dies zu einem viel langsameren Code führt.
quelle
Es gibt einige Überschneidungen mit dieser Frage, die das Problem von der anderen Seite abdeckt.
quelle
Nur aus Interesse können Sie einen Hexeditor aufbrechen und sich eine ausführbare Datei ansehen, die mit
-g
und ohne erstellt wurde. Sie können die Symbole und Dinge sehen, die hinzugefügt werden. Es kann auch die Assembly (-S
) ändern , aber ich bin nicht sicher.quelle
Einige Betriebssysteme (wie z / OS ) erzeugen eine "Seitendatei", die die Debug-Symbole enthält. Dies hilft zu vermeiden, dass die ausführbare Datei mit zusätzlichen Informationen aufgebläht wird.
quelle