Segmentation fault



  • Ich habe einen eigenartigen Programm-Absturz bei dem ich
    nichts mit die Fehlermeldung anfangen kann.

    Zur Vorgeschichte:
    das Programm (es verwendet Qt3) lief einwandfrei.
    Dann habe ich eine Datei-Öffnen und Lesen-Funktion eingebaut
    und seitdem stürzt es nach dem open/read/close-Zyklus ab.
    (alle Datei-Operationen laufen ohne Fehler ab).

    Ich habe das Programm mithilfe ddd gestartet
    und dann folgende Meldung erhalten:

    Detaching after fork from child process 6001

    Program received signal SIGSEV , Segmentation fault.
    0x53427475 in ?? ()

    Was bedeutet "Segmentation fault" ?



  • Du hast wahrscheinlich auf einen Speicherbereich zugegriffen , zu dem du keine Berechtigungen hast...zB: es könnte sein , dass du einen Null-Pointer vewendet hast bzw einen uninitialiseten Pointer...etc...

    Der SPeicherbereich ist Segmentert: Er ist in Segmente eingeteilt;
    Deinem Programm steht ein betsimmter Bereich zu;
    Wenn dein Programm nun versucht , auf/über ein Segment zuzugrefen , zu dem es keine Berechtigungen hat , dann kommt dieser Fehler.



  • Starte das Programm mit valgrind.



  • Also hier ist meine Lese-Routine, die anscheinend den Fehler veruracht:

    long Thexedit::hex_lesen(long istart)
    {
    long gelesen;
    long imax,i;
    int f;
    char bmem[5000];

    gelesen=0;
    imax=6*128;
    if (imax>laenge) imax=laenge;
    f=open(dname,O_RDONLY);
    if (f==-1) goto ende;
    lseek(f,istart,SEEK_SET);
    gelesen=read(f,&bmem,imax);
    close(f);

    ende:;
    return(gelesen);
    }

    "dname" ist bereits vorher definiert worden,
    "laenge" ist die Dateigrösse, die ebenfalls vorher bestimmt wurde,
    und grösser 0 ist.

    Der Wert für "gelesen" ist korrekt.
    Was ist hier falsch ??

    Sobald ich den Bereich zwischen open und close (einschl.) herauskommentiere,
    tritt kein Fehler mehr auf.



  • valgrind liefert mehrere Fehlermeldungen,
    aber ich habe keine Ahnung, wie ich die interpretieren soll:

    ==8551== Source and destination overlap in memcpy(0xbfffdd72, 0xbfffdd73, 4)
    ==8551== at 0x40023C59: memcpy (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x8057D1D: deletec(char*, int, int) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8057F14: linux_ansi(char*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806F936: Thexedit::Thexedit(char*, int, int, QWidget*, char const*, bool, unsigned) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551==
    ==8551== Invalid write of size 4
    ==8551== at 0x806F62C: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x4326843C is 136 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40510C61: QWidget::visibleRect() const (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DC2: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x43268400 is 76 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40510C6B: QWidget::visibleRect() const (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DC2: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x43268408 is 84 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40510C6E: QWidget::visibleRect() const (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DC2: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x43268404 is 80 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40510C7A: QWidget::visibleRect() const (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DC2: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x4326840C is 88 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40510C98: QWidget::visibleRect() const (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DC2: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x432683F4 is 64 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x40442C7D: QWidget::repaint(int, int, int, int, bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x40510DFA: QWidget::repaint(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806F646: Thexedit::hex_anzeigen(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x806FEA7: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x432683F4 is 64 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 1
    ==8551== at 0x4066779D: QDialog::exec() (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806FEAF: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x4326842C is 120 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x406677A7: QDialog::exec() (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806FEAF: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x432683F8 is 68 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid write of size 4
    ==8551== at 0x406677C1: QDialog::exec() (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806FEAF: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x432683F8 is 68 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Invalid read of size 4
    ==8551== at 0x406677C4: QDialog::exec() (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551== by 0x806FEAF: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x432683B4 is 0 bytes inside a block of size 244 free'd
    ==8551== at 0x4002AFF3: __builtin_delete (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x4002B011: operator delete(void*) (in /usr/lib/valgrind/vgskin_memcheck.so)
    ==8551== by 0x80751B3: Thexedit::~Thexedit() (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x4050F085: QWidget::close(bool) (in /usr/lib/qt3/lib/libqt.so.3.3.1)
    ==8551==
    ==8551== Jump to the invalid address stated on the next line
    ==8551== at 0x0: ???
    ==8551== by 0x806FEAF: new_hexeditor(QWidget*, char*, int, int, QColor) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x805678E: Thauptfenster::tastendruck(long) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== by 0x8070255: Thauptfenster::qt_invoke(int, QUObject*) (in /home/peter/cqq/wdis3/wdis3.x)
    ==8551== Address 0x0 is not stack'd, malloc'd or free'd
    Speicherzugriffsfehler



  • es fehlte der "closeevent" für das betreffende Fenster.

    Ich hatte den beim Kopieren aus einem anderen Element übersehen.

    Bin ganz zerknirscht und bedanke mich für eure bemühungen


Anmelden zum Antworten