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!
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!
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.
Schau dir mal die Variablen an, die vor der fehlerhaften Variable definiert sind.
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!
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); |
>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.
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.
Stefanie schrieb: > Obwohl dass > müsste es doch mit '\0' überlaufen.. Ja, was meinst du, welchem Dezimalwert die ASCII-\0 entspricht? Richtig, 0x00.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.