Forum: Compiler & IDEs Tipps zum Fehler finden


von Stefanie (Gast)


Lesenswert?

Hallo,

ich habe ein recht umfangreiches C-Projekt, dass objektorientiert 
angelegt ist (d.h. ich habe einzelne Strukturen, die thematisch sortiert 
sind).

Nun wird in diesem Projekt sporadisch eine int-Variable auf "0" gesetzt.
Diese Variable wird mit 5 initialisiert und kann nicht kleiner als 2 
sein. Es gibt keine Stelle in meinem Code, wo dieser Variable der Wert 0 
zugewiesen wird.

Ich bin schon langsam am verzweifeln!! Ich habe meinem kompletten Code 
nach dem Variablennamen durchgeprüft und auch ob irgendwo der Wert 0 
zugewiesen wird.

Ich habe meinen Code mit putchar-Meldungen gespickt, aber ich kann 
keinerlei Fehler finden!!!

Das Umspringen des Wertes passiert sporadisch und jedesmal zu einem 
anderen Zeitpunkt. Ich kann hier keine Systematik erkennen.

Habt ihr ein paar Tipps, wie man aussichtslose Fehler finden kann??
Ich weiß nun wirklich nicht mehr weiter!!

Danke schon mal!

von http://www.mikrocontroller.net/topic/203153#new (Gast)


Lesenswert?

Stefanie schrieb:
> ich habe ein recht umfangreiches C-Projekt, dass objektorientiert
> angelegt ist (d.h. ich habe einzelne Strukturen, die thematisch sortiert
> sind).
?

Gibt viele Möglichkeiten, vagabundierende Pointer, 
Out-Of-Bound-Zugriffe, vermurkste unions, ...


Ist das für PC? -->Debugger+Breakpoint!

von Rolf Magnus (Gast)


Lesenswert?

Stefanie schrieb:
> ich habe ein recht umfangreiches C-Projekt, dass objektorientiert
> angelegt ist (d.h. ich habe einzelne Strukturen, die thematisch sortiert
> sind).

Das hat erstmal nicht so viel mit Objektorientierung zu tun, sondern 
einfach mit strukturierter Programmierung.

> Ich bin schon langsam am verzweifeln!! Ich habe meinem kompletten Code
> nach dem Variablennamen durchgeprüft und auch ob irgendwo der Wert 0
> zugewiesen wird.

Hast du vielleicht irgendwo einen Zeiger auf die Variable?
Es könnte auch sein, daß du mit einem fehlerhaften Index auf ein Array 
zugreifst und dadurch in Speicher kommst, der gar nicht mehr zu diesem 
Array gehört und an dem dann eben zufällig diese Variable liegt.

> Ich habe meinen Code mit putchar-Meldungen gespickt, aber ich kann
> keinerlei Fehler finden!!!
>
> Das Umspringen des Wertes passiert sporadisch und jedesmal zu einem
> anderen Zeitpunkt. Ich kann hier keine Systematik erkennen.
>
> Habt ihr ein paar Tipps, wie man aussichtslose Fehler finden kann??

Am einfachsten wird es sein, im Debugger einen Watchpoint auf die 
Variable zu setzen.

von DirkB (Gast)


Lesenswert?

Schau dir mal die Variablen an, die vor der fehlerhaften Variable 
definiert sind.

von oszi40 (Gast)


Lesenswert?

Prüfpunkte setzen oder bei größerem Zweifel auch mal Speicher prüfen.

von Stefanie (Gast)


Lesenswert?

Vielen Dank für eure Tipps!!

Das System ist leider sehr Zeitkritisch, darum kann ich keine 
Breakpoints setzen, ohne das mir andere Komponenten aussteigen.

Aber der Tipp mit der vorher definierten Variable sieht mir seehr 
vielversprechend aus!! Davor hab ich ein Array definiert. Obwohl dass 
müsste es doch mit '\0' überlaufen...

Ich werd's auf jeden Fall testen, wenn ich die Hardware zur Hand habe!

von DirkB (Gast)


Lesenswert?

Du kannst ja schon mal schauen ob du irgendwo auf die Arraygrenze 
zugreifst.

Direkt:
1
array[ARRAYGRENZE] = 0;
Nach einer Schleife :
1
for (i=0;i<ARRAYGRENZE;i++)
2
{ ..}
3
array[i] = 0;
Oder bei einem Funktionsaufruf
1
tuwas(array,ARRAYGRENZE); // statt tuwas(array,ARRAYGRENZE-1);

von holger (Gast)


Lesenswert?

>Ich habe meinen Code mit putchar-Meldungen gespickt, aber ich kann
>keinerlei Fehler finden!!!

Fehler Nummer 1: Programm größer machen.

>Das Umspringen des Wertes passiert sporadisch und jedesmal zu einem
>anderen Zeitpunkt. Ich kann hier keine Systematik erkennen.

Gründe dafür wurden ja oben schon genannt.

>Habt ihr ein paar Tipps, wie man aussichtslose Fehler finden kann??
>Ich weiß nun wirklich nicht mehr weiter!!

Programm schrittweise kleiner machen bis der Fehler weg ist.
Manchmal reicht es schon überlange Strings aus dem Programm zu
entfernen oder zu kürzen.

von StinkyWinky (Gast)


Lesenswert?

Du könntest dafür sorgen, dass vor und nach der kritischen int-Variablen 
je eine Dummy Variable alloziert wird. Dann kannst du auf diese einen 
Write-Haltepunkt setzen, ohne dass bei jedem "guten" Zugriff die 
Ausführung unterbricht.

von Nico S. (Gast)


Lesenswert?

Stefanie schrieb:
> Obwohl dass
> müsste es doch mit '\0' überlaufen..

Ja, was meinst du, welchem Dezimalwert die ASCII-\0 entspricht? Richtig, 
0x00.

von Ralf (Gast)


Lesenswert?

Reihenfolge der globalen Variablen ändern, wenn's geht. Falls es dann 
eine andere Variable trifft -> Stacküberlauf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.