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:
- verwandt, aber KEIN Duplikat! (genau lesen, es ist überhaupt kein Duplikat): Was ist der Unterschied zwischen -O0 , -O1 und -g
- 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