Segmentation fault
-
Ich glaube, dass mein Topic hier am besten aufgehoben ist.
Woran kann es liegen, dass folgende Zeile einen Segmentation fault ergibt?std::list<Position> possibleMoves(moving->content->getMoves(Application::bm_));
Ich hatte an folgende gedacht:
-> moving(Pointer) ist gleich NULL oder nicht initialisiert
-> moving->content(Pointer) ist gleich NULL oder nicht initialisiert
-> Application__bm_(kein Pointer) ist nicht initialisiertScheint alles nicht hinzuhaun
Hier mal ein Auszug aus meiner gdb Analyse:
[b](gdb) run[/b] Program received signal SIGSEGV, Segmentation fault. 0x08060e4d in FigureEditor::contentsMouseReleaseEvent (this=0x816c390, e=0xbfffecf0) at figureeditor.cpp:262 /home/cobra/projects/chess/src/figureeditor.cpp:262:7748:beg:0x8060e4d [b](gdb) info thread [/b] * 1 Thread -1221197696 (LWP 4567) 0x08060e4d in FigureEditor::contentsMouseReleaseEvent (this=0x816c390, e=0xbfffecf0) at figureeditor.cpp:262 [b](gdb) backtrace [/b] #0 0x08060e4d in FigureEditor::contentsMouseReleaseEvent (this=0x816c390, e=0xbfffecf0) at figureeditor.cpp:262 #1 0xb7c7c842 in QScrollView::viewportMouseReleaseEvent () from /usr/lib/libqt-mt.so.3 #2 0xb7c7c0f9 in QScrollView::eventFilter () from /usr/lib/libqt-mt.so.3 #3 0xb7b6404e in QObject::activate_filters () from /usr/lib/libqt-mt.so.3 #4 0xb7b63f7c in QObject::event () from /usr/lib/libqt-mt.so.3 #5 0xb7b9caaf in QWidget::event () from /usr/lib/libqt-mt.so.3 #6 0xb7b09e1f in QApplication::internalNotify () from /usr/lib/libqt-mt.so.3 #7 0xb7b09514 in QApplication::notify () from /usr/lib/libqt-mt.so.3 #8 0xb7a9e5b0 in QETWidget::translateMouseEvent () from /usr/lib/libqt-mt.so.3 #9 0xb7a9c23e in QApplication::x11ProcessEvent () from /usr/lib/libqt-mt.so.3 #10 0xb7ab3254 in QEventLoop::processEvents () from /usr/lib/libqt-mt.so.3 #11 0xb7b1c1d8 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3 #12 0xb7b1c088 in QEventLoop::exec () from /usr/lib/libqt-mt.so.3 #13 0xb7b0a071 in QApplication::exec () from /usr/lib/libqt-mt.so.3 #14 0x08056c0a in main (argc=1, argv=0xbffffbd4) at main.cpp:113 [b](gdb) frame 0 [/b] #0 0x08060e4d in FigureEditor::contentsMouseReleaseEvent (this=0x816c390, e=0xbfffecf0) at figureeditor.cpp:262 /home/cobra/projects/chess/src/figureeditor.cpp:262:7748:beg:0x8060e4d [b](gdb) disassemble 0x8060e4d 0x8060ecd [/b] Dump of assembler code from 0x8060e4d to 0x8060ecd: 0x08060e4d <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+445>: call *0x8(%edx) 0x08060e50 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+448>: mov 0xffffffc8(%ebp),%eax 0x08060e53 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+451>: add $0xc,%esp 0x08060e56 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+454>: cmp %ebx,%eax 0x08060e58 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+456>: mov %eax,0xffffffac(%ebp) 0x08060e5b <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+459>: je 0x8060ef9 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+617> 0x08060e61 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+465>: add $0x8,%eax 0x08060e64 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+468>: mov 0xffffffa0(%ebp),%ebx 0x08060e67 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+471>: mov %eax,0xffffff9c(%ebp) 0x08060e6a <FigureEditor::contentsMouseReleaseEvent(QMouseEven t*)+474>: mov 0xac(%ebx),%eax 0x08060e70 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+480>: mov 0x78(%eax),%edx 0x08060e73 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+483>: mov 0x44(%edx),%eax 0x08060e76 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+486>: mov (%edi),%ecx 0x08060e78 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+488>: test %eax,%eax 0x08060e7a <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+490>: fldl 0x10(%ecx) 0x08060e7d <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+493>: js 0x8060f7a <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+746> 0x08060e83 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+499>: sar $0x3,%eax 0x08060e86 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+502>: push %eax 0x08060e87 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+503>: fidivl (%esp) 0x08060e8a <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+506>: fnstcw 0xffffffaa(%ebp) 0x08060e8d <FigureEditor::c ontentsMouseReleaseEvent(QMouseEvent*)+509>: mov 0xffffffaa(%ebp),%ax 0x08060e91 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+513>: mov $0xc,%ah 0x08060e93 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+515>: mov %ax,0xffffffa8(%ebp) 0x08060e97 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+519>: fldcw 0xffffffa8(%ebp) 0x08060e9a <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+522>: fistpl 0xffffffa4(%ebp) 0x08060e9d <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+525>: fldcw 0xffffffaa(%ebp) 0x08060ea0 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+528>: mov 0x40(%edx),%eax 0x08060ea3 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+531>: add $0x4,%esp 0x08060ea6 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+534>: test %eax,%eax 0x08060ea8 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+536>: mov 0xffffffa4(%ebp),%ebx 0x08060eab <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+539>: fldl 0x8(%ecx) 0x08060eae < FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+542>: js 0x8060f72 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+738> 0x08060eb4 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+548>: sar $0x3,%eax 0x08060eb7 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+551>: push %eax 0x08060eb8 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+552>: fidivl (%esp) 0x08060ebb <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+555>: fldcw 0xffffffa8(%ebp) 0x08060ebe <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+558>: fistpl 0xffffffa4(%ebp) 0x08060ec1 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+561>: fldcw 0xffffffaa(%ebp) 0x08060ec4 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+564>: mov 0xffffffa4(%ebp),%eax 0x08060ec7 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+567>: push %ebx 0x08060ec8 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+568>: push %eax 0x08060ec9 <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+569>: push %esi 0x08060eca <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+570>: call 0x8057ae0 <Position> End of assembler dump. [b](gdb) display moving[/b] 1: this->moving = (class Rectangle *) 0x81e8d60 [b](gdb) display moving->content[/b] 2: this->moving->content = (class Man *) 0x8162058 [b](gdb) display Application::bm_[/b] 3: Application::bm_ = {matrix_ = {{0x8161f98, 0x8162028, 0x0, 0x0, 0x0, 0x0, 0x8161ea8, 0x8161e18}, {0x8161ff8, 0x8162040, 0x0, 0x0, 0x0, 0x0, 0x8161ec0, 0x8161e78}, {0x8161fe0, 0x8162058, 0x0, 0x0, 0x0, 0x0, 0x8161ed8, 0x8161e60}, {0x8161f80, 0x8162070, 0x0, 0x0, 0x0, 0x0, 0x8161ef0, 0x8161e00}, {0x8161f68, 0x8162088, 0x0, 0x0, 0x0, 0x0, 0x8161f08, 0x80d78e8}, {0x8161fc8, 0x81620a0, 0x0, 0x0, 0x0, 0x0, 0x8161f20, 0x8161e48}, {0x8162010, 0x81620b8, 0x0, 0x0, 0x0, 0x0, 0x8161f38, 0x8161e90}, {0x8161fb0, 0x81620d0, 0x0, 0x0, 0x0, 0x0, 0x8161f50, 0x8161e30}}} [b](gdb) Quit[/b]
Fuer mich sieht das alles recht unverdaechtig aus. Der Compiler ist sich aber trotzdem sicher, dass in der angegebenen Zeile der Wurm drin ist.
Any suggestions?
-
Raptor schrieb:
Any suggestions?
relevanten quellcode. und wenn überhaupt dann ein disassembly von der richtigen stelle, der code der nach dem segfault kommt interessiert nicht wirklich... - und wenn schon disassembly, dann bitte auch ein registerdump
-
camper schrieb:
Raptor schrieb:
Any suggestions?
relevanten quellcode.
Ich habe doch alles relevante erwaehnt. Ansonsten sag mir, was ich vergessen habe.
Ich will nicht, dass ihr mir den error sucht(zu viel code zu posten), sondern Vorschlaege macht,
welche ursachen der sigsegv in genau dieser zeile haben koennte, also was ich in meiner liste vergessen habe.
-
alles relevante? ich glaube nicht
Program received signal SIGSEGV, Segmentation fault. 0x08060e4d in FigureEditor::contentsMouseReleaseEvent (this=0x816c390, e=0xbfffecf0) at figureeditor.cpp:262 0x08060e4d <FigureEditor::contentsMouseReleaseEvent(QMouseEvent*)+445>: call *0x8(%edx)
hier knallt es, alles was danach kommt interessiert nicht, was davor war dagegen schon.
das ist vermutlich eine virtueller aufruf ( getMoves? das kann ich nur vermuten ).
das erste was also zu tun ist, ist den inhalt von edx zu prüfen.
wenn es ein virtueller aufruf ist, und in edx ein ungültiger wert steht, kann das eigentlich nur passieren, wenn der vtbl pointer des objekts überschrieben wurde (oder das objekt bereits zerstört wurde) - also: memory dump des objekts überprüfen.all das ist nur vermutung, solange du den code, der zum fehler führte, unter verschluss hälst. kann sein, dass edx etwas völlig anderes enthält als den vtbl pointer.
-
tatsaechlich...
(gdb) info register eax 0x81f1f08 136257288 ecx 0x8161ef0 135667440 edx 0x0 0 ebx 0xbfffebd0 -1073746992 esp 0xbfffeb90 0xbfffeb90 ebp 0xbfffec08 0xbfffec08 esi 0xbfffebe0 -1073746976 edi 0x81f4e78 136269432 eip 0x8060e4d 0x8060e4d eflags 0x10286 66182 cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb)
die funktion getMoves ist virtual. Wie kann es denn passieren, dass einfach so der vptr resetted wird und was kann ich dagegen machen?
Jetzt weiss ich schonmal, was die Ursache ist.
thx soweit!