www.mikrocontroller.net

Forum: Compiler & IDEs Probleme mit gdb


Autor: Martin Do (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe folgendes Problem. gdb springt beim Debuggen im Quellcode
herum und führt einige Zeilen doppelt aus. Ich kann auch nicht mehr
kürzlich belegte Variablen ausgeben. Woran kann das denn liegen ? Hat
jemand von euch eine Ahnung. Vielen Dank im voraus.

mfg

martin

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
,,einige Zeilen doppelt ausführen'' klingt nach einem
Garnicht-Problem, bei dem der optimierte Code für eine C-Quellzeile
einfach an verschiedenen Stellen im Objektcode liegt, verschachtelt
mit anderem Objektcode.

Gewöhn' dich einfach dran, dass sowas passieren kann.

> Ich kann auch nicht mehr kürzlich belegte Variablen ausgeben. Woran
> kann das denn liegen ?

Dass der Compiler diese Variablen an der entsprechenden Stelle bereits
wieder wegoptimiert hatte, weil sie gemäß Code-Analyse gar nicht mehr
benötigt werden.  Manche deiner Variablen werden auf diese Weise gar
ganz aus dem Objektcode verschwinden.  Da Variablen natürlich nach
Möglichkeit in Registern abgelegt werden, werden die Register sofort
neu belegt, wenn sie nicht mehr gebraucht werden.

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neulich bin auf ein ähnliches Problem gestossen. Es handelte sich um C++
Code. Zum debuggen hab ich einfach die Optimierung komplett
ausgeschaltet. Damit konnte ich das Problem mit den wilden rumspringen
umgehen.

Ciao,
Kai

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber der völlig falsche Weg.
Der Code, der später nicht im "Produkt" verwendet werden soll,
braucht auch nicht "debugged" werden. Ohne Optimierung entsteht aber
eben solcher! Da können Fehler auftauchen, die bei einer optimierten
Variante gar nicht auftreten (können) und Umgekehrt.

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Patrick:
Ich glaube nicht das dieser Weg falsch ist, denn den Debugger schmeiss
ich zum Fehler suchen an und nicht um meine Software zu verifizieren.
Die Verifikation wird auschliesslich durch testen der ferigen
Application im Feldversuch vorgenommen.

Ciao,
Kai

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hab ich mich falsch ausgedrückt:

Ich meinte natürlich, daß je nach Optimierungsstufe anderer Binärcode
hinten rausfällt. Das taugt doch vorne und hinten nicht, um Fehler zu
finden...

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Patrick,

schau Dir mal die Vorgehensweise beim beim Microsoft VC++ Compiler an.
Zum debuggen wird eine Debugversion erstellt. Und zum fertigen Release
eine dementsprechende Release Version. Microsoft ist vielleicht nicht
das beste Beispiel, aber es zeigt das es anscheinend doch geht. Ich
persönlich habe damit auch noch keine schlechten Erfahrungen gemacht
zumal beim ändern des Optimierungsstatuses bei mir grundsätzlich
offentsichtliche Fehler aufgetreten sind.

Ich muss Dir aber zustimmen, dass es nicht die perfekte Lösung ist.
Dennoch ist es unmöglich (wenn man den Überblick behalten will) eine SW
in C++ zu deguggen wenn die Optimierung eingeschaltet ist. Ich wäre auch
glücklicher wenn mir jemand eine andere Möglichkeit nennen könnte.

Ciao,
Kai

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nana, das sind zwei verschiedene Paar Schuhe!

Du kannst auch dem gcc sagen, daß er einmal mit und einmal ohne
Debuginfos kompilieren soll. Das beeinflusst aber den Ausgeführten Code
in keinster Weise. Das was Du da machst aber schon!

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nenn mir eine bessere Methode..:-)

Autor: Martin Do (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

erstmal danke für die vielen Antworten. Hab jetzt wieder was dazu. Ich
möchte aber nur mal dumm fragen. Welche Fehler können den entstehen
wenn ich die Optimierung wegmache, den Code dann modifiziere und die
Optimierung wieder reinmache ?

Gruß

Martin

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler könnte Codestellen wegoptimieren, die er ohne Optimierung
nicht angefasst hat. Somit ist es möglich, dass sich Dein Programm
anders verhält, was natürlich nicht unbedingt sofort sichtbar ist.

Wie gesagt ich kenne beim GCC im Zusammenhang mit C++ keine andere
Möglichkeit. Ich habe aber auch keine schlechten Erfahrungen bisher
gemacht. Probleme bekommst Du nur wenn Du versuchst einen Fehler zu
debuggen der ausschliesslich mit Optimierung da ist.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Probleme bekommst Du nur wenn Du versuchst einen Fehler zu debuggen
> der ausschliesslich mit Optimierung da ist.

Alles andere als simple Anfängerfehler tendieren aber nach meiner
Erfahrung, just in diese Kategorie zu fallen.  Der Code ist erstmal
,,offensichtlich korrekt'', und wenn man den nichtoptimierten Code
im
Einzelschritt (oder geschlossen) abarbeitet, funktioniert alles.  Mit
Optimierung darf der Compiler aber plötzlich bestimmte Dinge ganz
anders umsetzen -- und der kleine versteckte Fehler schlägt zu.

Daher ist es auch meine Erfahrung (wie Patricks): lass die Optmierung
auf dem Stand, auf dem du sie am Ende haben willst, und gewöhn' dich
an die Artefakte beim Debuggen, die sich daraus ergeben.

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ..und gewöhn' dich
> an die Artefakte beim Debuggen, die sich daraus ergeben.

in der Hoffnung Du verstehst den Code dann noch.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du ihn nicht verstehst, hast du was falsch gemacht. ;-)

Verstehen muss man doch den Sourcecode.  Ob der Debugger nun beim
Abarbeiten zwischen den Quellzeilen hoch- und runterhüpft oder sie
geradlinig abarbeitet, ist doch egal (solange keine volatile-Objekte
zwischenzeitlich zugegriffen werden, natürlich).

Den generierten Objektcode zu verstehen, ist zwar nett (und oft
hilfreich), aber nicht zwingend notwendig.

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
falsch gemacht hab ich nichts..:-).

bestes Beispiel ist mal wieder SimuAvrxx.
Da dort, so wie es aussieht noch einige Bugs in der Windows Portierung
drin sind muss ich den Code schon verstehen, zumal der nicht von mir
ist. Dafür musste ich z.B die Optimierung ausschalten um zu verstehen
von Hase in den Pfeffer läuft..:-).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.