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 ksAddSequenz

    Der 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 = 0x202310

    seqID = 19
    -------------------------------------------
    sizeKmdArr = 232
    seqDaten[seqID].kopf.anzahlKommandos = 2

    und 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


Anmelden zum Antworten