Programm stuerzt ab mit signal BUS
-
Hallo,
mein Programm laeuft unter Solaris und stuerzt ab bzw. legt einen Coredump an. Auswertung des Dumps ergibt folgendes:void ksAddSequenz(int seqID, tKseqKopfdaten *seqKopf) { char *cFuncName = "ksAddSequenz"; int sizeKmdArr; /* Groesse des Arrays fuer Kommandos dieser Sequenz */ /* Plausibilitaetscheck */ if (validSeqID(seqID) && seqKopf != NULL) { /* unkopieren der gesamten Kopfdaten */ seqDaten[seqID].kopf = *seqKopf; /* Datensatz testen */ if (!checkSequenz(seqID)) { md_ErrSyslog(0, 0, "=> Fehler in Sequenzdaten der Sequenz %d\n", seqID); } /* jede Sequenz ist durch ihre sequenzID eindeutig bestimmt */ if (seqDaten[seqID].seqID != seqID) { /* neue Sequenz einfuegen */ seqDaten[seqID].seqID = seqID; if (seqDaten[seqID].kopf.anzahlKommandos == 0) { /* keine Kommandos zur Sequenz vorh. */ seqDaten[seqID].kdo = NULL; seqDaten[seqID].anzKdoMalloc = 0; } else { /* Speicherplatz fuer Kommandos der neuen Sequenz besorgen */ sizeKmdArr = (seqDaten[seqID].kopf.anzahlKommandos * sizeof(tSeqKommando)); if ( (seqDaten[seqID].kdo = (tSeqKdoArrP)malloc(sizeKmdArr)) == NULL )
Der Zeiger zeigt auf die letzte Anweisung in diesem Code-Auszug.
Debugger meldet folgendes:
program terminated by signal BUS (invalid address alignment)
Current function is ksAddSequenzDer Stack sieht so aus:
md_HearMother(client_data = (nil), fid = 0x2f2aac, id = 0xffbedd7c) md_CallSbHandler() mySbHandler() sbHandleTele(tele = 0x300e68) sbrSeqKopf(skopf = RECORD) ksAddSequenz(seqID = 19, seqKopf = 0xffbed54c) _madvise(0xe8, 0xffbedaa4, 0xff35e5e4, 0xffbedb94, 0x1, 0x1) _malloc_unlocked(0xe8, 0x30bf48, 0xfe83c008, 0xe8, 0x30cdc8, 0x0) t_delete(0x30cdc8, 0xfe83c008, 0xfe8427cc, 0xfe84284c, 0xfe842848, 0x0)
wobei der Zeiger auf ksAddSequenz(seqID ... zeigt.
Die Variablen sehen wie folgt aus:
-------------------------------------------
seqDaten[seqID].kdo = (nil)
-------------------------------------------
&seqDaten[seqID].kdo = 0x202310seqID = 19
-------------------------------------------
sizeKmdArr = 232
seqDaten[seqID].kopf.anzahlKommandos = 2und die beteiligten Typdefinitionen:
tSequenz seqDaten[cMaxAnzSequenzen + 1] #define cMaxAnzSequenzen 500 typedef tSeqKommando tSeqKdoArr[cMaxAnzSequenzKommandos]; typedef tSeqKdoArr *tSeqKdoArrP; /* Alle Informationen zu den Sequenzen */ typedef struct { int seqID; /* Schluessel: eindeutige ID */ tKseqKopfdaten kopf; /* allg. Daten zur Sequenz */ int anzKdoMalloc; /* bereits reservierte Plaetze fuer Kdos */ tSeqKdoArrP kdo; /* Zeiger auf Liste der Kommandos */ } tSequenz; typedef struct { int funktionsNummerVICOS; /* Schluessel in stwkdo */ short StwTypIndex; /* STW-Typ */ short AktTeleNrFstKdo; /* Aktuelles Telegramm in */ /* einem Telegrammschwall */ short MaxAnzTeleFstKdo; /* Anzahl der Telegramme in */ /* einem Telegrammschwall */ short elementAnzahl; /* Anzahl Elemente */ tTa kommandoTA[cMaxAnzKommandoTAs]; /* technologische Adressen */ char KommandoString[cMaxLenKdoString]; /* transparenter Kommando- * string, cMaxLenKdoString * in sbcbdstw.h */ } tSeqKommando;
Leider kann ich den Fehler nicht erkennen. Die Adresse von seqDaten[seqID].kdo ist eindeutig durch vier teilbar, so dass ich keinen Grund fuer ein Alignment-Problem erkennen kann.
Hat da jemand eine Idee?
Vielen Dank und viele Gruesse - Ulrich
-
dem stackdump nach crashed dein 'malloc'. hast du vielleicht irgendwann vorher den heap zerschossen (z.b. über speicher hinaus geschrieben, der mit einem vorhergehenden malloc angefordert wurde)?
-
Hallo ~fricky,
danke fuer die Antwort. Die Vermutung hatte ich auch schon, dass ich mir irgendwelche Speicherbereiche durch Feldgrenzenueberschreitung ueberschreibe. Ich bin gerade dabei, das Programm mit insure daraufhin zu untersuchen.
Viele Gruesse - Ulrich