Ist der Wert in gdb ein Problem?

8

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!

    
bbazso 16.02.2010, 15:02
quelle

5 Antworten

10

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).

    
Paul R 16.02.2010, 15:06
quelle
5

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.

    
Stefano Borini 16.02.2010 15:05
quelle
2

Wenn Sie den Fehler in Ihrem Programmablauf feststellen können, könnten Sie selbst etwas drucken, wenn es etwas mit Speicherlecks und Speicherkorruption zu tun hat, dann ist Valgrind wahrscheinlich ein besserer Freund als gdb.

    
amo-ej1 16.02.2010 15:16
quelle
0

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 .

    
Adam Goode 16.02.2010 15:22
quelle
0

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.

    
MikeW 11.04.2011 13:56
quelle

Tags und Links