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 initialisiert

    Scheint 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?


  • Mod

    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.


  • Mod

    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!


Anmelden zum Antworten