Ich habe eine Anwendung, die nur bei -O2-Optimierung abstürzt (kompiliert mit gcc 4.2.4). Wenn ich durch den Code gehe und zu dem Punkt komme, der abstürzt und versuche, den Wert zu überprüfen, bekomme ich einen "Wert optimiert" in gdb.
Ich habe im Internet gelesen, dass dies bedeutet, dass der Wert im Register gespeichert ist. Ich habe mich gefragt, ob mein Absturz mit der Tatsache zusammenhängen könnte, dass einige Informationen in Registern stehen? Gibt es eine Möglichkeit zu drucken, was in den Registern ist, um zu sehen, ob es beschädigt ist? Gibt es eine Möglichkeit, Optimierungen beizubehalten, aber keine Register zu verwenden?
Danke!
Es ist zu 99% wahrscheinlich ein Fehler in Ihrem Code und 1% wahrscheinlich ein Fehler bei der Erstellung eines Compiler-Codes. Vergeuden Sie also eine gewisse Zeit damit, nach latenten Fehlern in Ihrem Code zu suchen, aber seien Sie sich bewusst, dass Sie einen Fehler gefunden haben (in diesem Fall müssen Sie den compilergenerierten Code sorgfältig untersuchen) sehen, was das Problem ist).
probiere info registers
in gdb.
Sie können die Optimierung mit -O0 deaktivieren, aber es ist etwas faul und ich schlage vor, Sie weiter zu untersuchen und schließlich den Code zu veröffentlichen.
Dies ist kein Problem, es ist eher ein Problem mit den aggressiven Optimierungen in neueren Versionen von gcc.
Siehe: Ein Plan zur Behebung lokaler Debug-Informationen in GCC .
Die einzige Sache, die Sie beachten sollten, ist das Pointer-Aliasing, bei dem der Compiler Annahmen treffen kann, die Sie nicht einhalten, zum Beispiel dass ein Zeiger, den Sie an eine Funktion übergeben, nicht auf eine globale Variable zeigt, die auch von dieser Funktion verwendet wird. Aber Sie können dies mit Compiler-Optionen usw. steuern.