Fehlersuche mit Linux-Tools



  • Moin,

    ich habe ein Problem und meine Frage bezieht sich vorallem darauf, mit welchen Tools ich den Fehler finden könnte. Außerdem sind im betroffenen Code Linux-Spezische Befehle verwendet ("pthread_create"), weshalb ich in diesem Forum schreibe. Um mein Problem zu beschreiben möchte ich erstmal etwas Code zeigen:

    void COPPortAudio::play () {
            if ( ! m_bPlaying ) {
                    m_bPlaying = true;
                    pthread_create ( &m_tPlay, NULL, playthread, this );
                    std::cout << "[  # 1  ]" << std::endl;
                    sleep ( 1 ); // TODO: Wait until Buffer is full
                    std::cout << "[  # 2  ]" << std::endl;
                    PaError err = Pa_StartStream( m_pStream );
                    std::cout << "[  # 3  ]" << std::endl;
                    if ( err != paNoError ) { std::cerr << Pa_GetErrorText ( err ) << std::endl; }
            }
    }
    

    In Zeile 6 (bei dem "sleep") kriege ich einen Fehler:

    *** glibc detected *** ./test: free(): invalid pointer: 0xb7db5150 ***
    

    Nun bin ich mir ziemlich sicher, dass nicht wirklich "sleep" den Fehler verursacht.
    Leider bin ich mit dem Umgang mit GDB nicht besonders geübt und kriege damit auch keine weiteren Informationen zu diesem Fehler: Sogar die Stelle im Quelltext, die zum Absturz führt, habe ich nur mithilfe der Debug-Ausgaben finden können, GDB hat mir nur einen Stack angezeigt, aus dem ich nicht schlau wurde:

    (gdb) bt   
    #0  0xffffe410 in __kernel_vsyscall ()
    #1  0xb7cccb31 in raise () from /lib/libc.so.6
    #2  0xb7cce318 in abort () from /lib/libc.so.6
    #3  0xb7d0382b in ?? () from /lib/libc.so.6
    #4  0x00000009 in ?? ()
    #5  0xb7c89d70 in ?? ()
    #6  0x00000400 in ?? ()
    #7  0x00000000 in ?? ()
    

    Kann jemand etwas Rat geben, wie ich den Fehler finden und beheben könnte?

    Danke im Voraus!



  • Wahrscheinlich wird der Fehler in dem erzeugten thread verursacht.
    Schau doch einfach mal da nach wo du free() aufrufst und der Fehler sollte
    schnell gefunden sein.



  • Kompilierst du auch im Debug-Modus?

    Probier den hier mal aus: http://home.gna.org/nemiver/
    Damit ist das Debuggen einfacher als per CLI.



  • Schau dir mal Valgrind an. Wenn du Fehler in der Speicherbehandlung hast, ist das Tool #1!



  • the[V]oid schrieb:

    *** glibc detected *** ./test: free(): invalid pointer: 0xb7db5150 ***
    

    ist der speicher auf den betreffender pointer zeigt auch mit malloc()/realloc() alloziert worden? falls mit new dann mit delete freigeben. der fehler selbst kann ja eigentlich nur in playthread() liegen.


Anmelden zum Antworten