Was ist der Unterschied zwischen der `-O0`-Option und der `-Og`-Option eines Compilers?

Lesezeit: 3 Minuten

Benutzer-Avatar
Gabriel Staples

Wenn ich C- oder C++-Programme debuggen möchte, wurde mir die Verwendung beigebracht -O0 um die Optimierung auszuschalten, und -ggdb Symbole in die ausführbare Datei einzufügen, die für die Verwendung von GNU optimiert sind gdb Debugger, den ich verwende (oder Sie verwenden können -glldb für LLVM/Clangs lldb Debugger, oder einfach nur -g für allgemeine Debugging-Symbole, aber das wird nicht so gut sein -ggdb offenbar…). Ich bin jedoch kürzlich auf jemanden gestoßen, der sagte, ich solle es verwenden -Og (anstatt -O0), und es hat mich unvorbereitet getroffen. Sicher genug, es ist drin man gcc!:

-Og Optimieren Sie das Debugging-Erlebnis. -Og ermöglicht Optimierungen, die das Debugging nicht beeinträchtigen. Es sollte die Optimierungsebene der Wahl für den standardmäßigen Bearbeitungs-Kompilierungs-Debug-Zyklus sein und ein angemessenes Optimierungsniveau bieten, während eine schnelle Kompilierung und ein gutes Debugging-Erlebnis aufrechterhalten werden.

Also, was ist der Unterschied? Hier ist die -O0 Beschreibung ab man gcc:

-O0 Reduzieren Sie die Kompilierungszeit und sorgen Sie dafür, dass das Debugging die erwarteten Ergebnisse liefert. Dies ist die Standardeinstellung.

man gcc klar sagt -Og “sollte jedoch die Optimierungsstufe der Wahl für den Standard-Bearbeitungs-Kompilierungs-Debug-Zyklus sein”.

So klingt es -O0 ist wirklich “keine Optimierungen”, während -Og ist “einige Optimierungen an, aber nur solche, die das Debugging nicht stören.” Ist das richtig? Also, was soll ich verwenden und warum?

Verwandt:

  1. verwandt, aber KEIN Duplikat! (genau lesen, es ist überhaupt kein Duplikat): Was ist der Unterschied zwischen -O0 , -O1 und -g
  2. meine Antwort zum Debuggen --copt= Einstellungen zur Verwendung mit Bazel: gdb: Kein Symbol “i” im aktuellen Kontext

  • Das Handbuch hat mehr Details: Like -O0, -Og completely disables a number of optimization passes so that individual options controlling them have no effect. Otherwise -Og enables all -O1 optimization flags except for those that may interfere with debugging:. Dann listet es die genauen deaktivierten Flags auf.

    – Kaylum

    13. August 2020 um 0:04 Uhr


  • Ah, das ist nützlich! Das sind mehr Informationen als drin sind man gcc!

    – Gabriel Staples

    13. August 2020 um 0:09 Uhr

  • Wenn Sie die Auszüge in Ihrer Frage sorgfältig lesen, ist die Antwort meiner Meinung nach ziemlich eindeutig. -Og optimiert das Debugging-Erlebnis, wohingegen -O0 minimiert die Kompilierungsgeschwindigkeit. Sie verwenden möchten -Og Wenn Sie Spaß am Debuggen haben möchten, -O0 wenn Sie schnell herausfinden wollen, ob das verdammte Ding überhaupt kompiliert.

    – Antti Haapala – Слава Україні

    13. August 2020 um 4:23 Uhr

  • @AnttiHaapala, stimmt, aber es ist schön, eine Bestätigung von anderen Entwicklern zu haben, besonders wenn ich von den neuen Informationen so überrascht bin (dh: dass -Og gibt es sogar).

    – Gabriel Staples

    13. August 2020 um 19:01 Uhr

Benutzer-Avatar
Gabriel Staples

@kaylum hat gerade einen großartigen Einblick in ihren Kommentar unter meiner Frage gegeben! Und der Schlüsselteil, der mir am meisten am Herzen liegt, ist dieser:

[-Og] ist eine bessere Wahl als -O0, um debugfähigen Code zu erzeugen, da einige Compilerdurchläufe, die Debug-Informationen sammeln, bei -O0 deaktiviert sind.

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

Also benutze ich ab jetzt -Og (NICHT -O0) zusätzlich zu -ggdb.


AKTUALISIERUNG 13.08.2020:

Verdammt noch mal! Egal. Ich bleibe dabei -O0.

Mit -Og Ich bekomme <optimized out> und Can't take address of "var" which isn't an lvalue. Fehler überall! Ich kann meine Variablen nicht mehr drucken oder ihren Speicher untersuchen! Ex:

(gdb) print &angle
Can't take address of "angle" which isn't an lvalue.
(gdb) print angle_fixed_p
$6 = <optimized out>

Mit -O0aber alles funktioniert gut!

(gdb) print angle
$7 = -1.34869879e+20
(gdb) print &angle
$8 = (float *) 0x7ffffffefbbc
(gdb) x angle
0x8000000000000000:     Cannot access memory at address 0x8000000000000000
(gdb) x &angle
0x7ffffffefbbc: 0xe0e9f642

Also zurück zur Nutzung -O0 anstatt -Og es ist!

Verwandt:

  1. [they also recommend -O0, and I concur] Was bedeutet in gdb?

  • Ich empfehle auch -O0 zum Debuggen. Mit -Og Haltepunkte neigen dazu, an falschen Zeilen auszulösen.

    – KEIN NAME

    18. März um 18:19 Uhr

1012670cookie-checkWas ist der Unterschied zwischen der `-O0`-Option und der `-Og`-Option eines Compilers?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy