Hallo,
ich habe eine scheinbar triviale Funktion geschrieben, in welcher in
einer Schleife eine Variable hochgezählt und eine Funktion aufgerufen
wird.
Der Funktion wird die Variable übergeben.
Das ganze funktioniert nicht richtig. Die Variable nimmt ständig
merkwürdige Werte an?!
1
intFunktion_1(structdev*device)
2
{
3
intii=0;
4
intii_temp=0;
5
6
printf("check for devices:\n");
7
8
[...]
9
10
do
11
{
12
printf("device count: %i\n",device->count);
13
printf("ii: %i\n",ii);
14
printf("ii_temp: %i\n",ii_temp);
15
16
status=Funktion_2(device,ii_temp,INIT_COMPLETE);
17
18
if(status==1)
19
{
20
printf("ii: %i\n",ii);
21
printf("ii_temp: %i\n",ii_temp);
22
printf("init complete Modul ID : %x\n",device->modul[ii_temp].id);
23
}
24
else
25
{
26
error_flag++;
27
printf("error flag: %i\n",error_flag);
28
}
29
30
ii++;
31
ii_temp=ii;
32
printf("i: %i\n",ii);
33
printf("i_temp: %i\n",ii_temp);
34
35
}while(ii<device->count);
Als Ausgabe kommt z.B.:
1
check for devices:
2
device count 1
3
ii: 0
4
ii_temp: 0
5
ii: 0
6
ii_temp: 0
7
init_complete Modul ID: 4
8
ii: -1238642063
9
ii_temp: -1238642063
10
device count 1
11
ii: -1238642063
12
ii_temp: -1238642063
...ab hier hängt sich das Programm auf.
Das Verhalten ist aber nicht immer reproduzierbar.
Was läuft falsch? Wo kommt plötzlich der Inhalt her?
Aus Zeile 42 von Funktion_2 ?
Irgendwo schreibst du dir da den Stack kaputt. Das passiert aber nicht
in den gezeigten Zeilen, ausser, der Stack ist viel zu klein, und läuft
einfach so über.
Oliver
> Irgendwo schreibst du dir da den Stack kaputt.
Sowas dachte ich mir auch. Aber ich weiß nicht wo das geschehen soll.
Die Funktion_2 kann das doch nicht ohne weitere machen, oder?
> der Stack ist viel zu klein
Legt man dessen Größe irgendwo fest?
Das Problem tritt nicht immer auf. Manchmal funktioniert es, manchmal
aber nicht...
Was auch ganz oft passiert:
Als Ausgabe kommt z.B.:
check for devices:
device count 2
ii: 1
ii_temp: 1
ii: 1
ii_temp: 1
init_complete Modul ID: 4
ii: 1
ii_temp: 1
device count 1
ii: 1
ii_temp: 1
d.h. die Variablen werden wieder auf 0 gesetzt?!
qwertz schrieb:> Würde es reichen die beiden Funktionen komplett zu zeigen?
Vielleicht. Kann aber auch sein, dass irgendwo vorher schon Daten im
Speicher (z.B. durch Overflows) überschrieben wurden.
Aber dann bitte auch alle (globalen) Variablen und Typ-definitionen, die
Du in den beiden Funktionen verwendest, zeigen, insb. structs etc.
> Linux raspberrypi 3.6.11+
Ah, ok.
Wie stellst Du eigentlich sicher, dass modul_count im ersten
do-while-Block (in der Funktion get_can_module_2()) nicht gegen
unendlich läuft?
Bitte noch alle globalen Variablen-Definitionen bzw. Typ-Deklarationen
wie structs zeigen.
qwertz schrieb:>> Ah, ok.>> Sarkasmus?
Hättest Du mal auf meine Benutzerseite geklickt, hättest Du auf einen
Schlag erkennen können, dass ich ein alter Linux-Hase bin ;-)
> Wie stellst Du eigentlich sicher, dass modul_count im ersten> do-while-Block (in der Funktion get_can_module_2()) nicht gegen> unendlich läuft?
Bisher noch nicht.
qwertz schrieb:> Würde es reichen die beiden Funktionen komplett zu zeigen?
Natürlich nicht.
qwertz schrieb:> int get_can_module_2(struct dev *device)> {> printf("check for CAN devices:\n");>> struct can_frame in_frame;> int status = 0;> int modul_count = 0;
...
> status = can_dump(&in_frame);
Rate mal, welche Funktion wir als nächstes sehen wollen.
Oliver
Evtl. als Zwischenscritt sinnvoll:
Aktivier beim compilieren deines Programmes alle
Compiler-Warning-Optionen.
Reparier deinen Quelltext, bis der Compiler nichts mehr zu meckern
findet.
Dann: Compilier mit Stack-Protector
(-fstack-protector, -fstack-protector-strong, ...)
Schau nach, ob das Problem noch auftritt, oder ob du einen
Reproduzierbaren Programmabbruch bekommst.
qwertz schrieb:>> Wie stellst Du eigentlich sicher, dass modul_count im ersten>> do-while-Block (in der Funktion get_can_module_2()) nicht gegen>> unendlich läuft?>> Bisher noch nicht.
Dann sichere das ab. Wenn modul_count >= DEVICE_MAX wird, dann
überschreibst Du Dir den Speicher.
qwertz schrieb:> Außerdem habe ich alle Warnungen ausgemerzt und jetzt läuft es.
Woran lag es? Schade, dass Du die Warnungen hier nicht vorher gepostet
hast.