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