2009-05-26 8 views
5

ich ein sehr einfaches Qt-Programm hier schrieb:Nach einem Haltepunkt in Qt Einstellung, sagt GDB: „Fehlerspeicheradresse zugreifen“

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    QTableView table(&frame); 
    table.resize(100, 100); 
    table.show(); 

    return app.exec(); 
} 

Und wenn ich versuche, einen Haltepunkt zu setzen, wo der Tisch bekommt geklickt haben, bekomme ich diesen Fehler von gDB:

(gdb) symbol-file /usr/lib/libQtGui.so.4.4.3.debug 
Load new symbol table from "/usr/lib/libQtGui.so.4.4.3.debug"? (y or n) y 
Reading symbols from /usr/lib/libQtGui.so.4.4.3.debug...done. 
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)' 
Breakpoint 1 at 0x5fc660: file .moc/release-shared/moc_qabstractitemview.cpp, line 313. 
(gdb) run 
Starting program: ./qt-test 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0x5fc660: Input/output error. 

weiß jemand, warum kann der Haltepunkt nicht eingefügt werden?

+0

Ich benutze Ubuntu Intrepid, und ich habe libqt4-dbg installiert, wenn das überhaupt hilft. – Neil

Antwort

2

Wenn Sie main automatisch unterbrechen möchten, ohne einen Haltepunkt zu setzen, können Sie auch den Befehl start verwenden.
Wenn Sie Argumente für das Programm zur Verfügung stellen müssen Sie verwenden können:
start argument1 argument2

11

Verwenden Sie nicht den Befehl gdb symbol-file, um externe Symbole zu laden. Die Haltepunktadressen sind falsch, da sie nicht verschoben werden.

Stattdessen setzte einen Haltepunkt in main, das Programm auszuführen, und stellen Sie dann Ihren Breakpoint:

gdb ./program 
GNU gdb 6.8-debian blah blah blah 
(gdb) br main 
Breakpoint 1 at 0x80489c1 
(gdb) run 
Starting program: ./program 
Breakpoint 1, 0x080489c1 in main() 
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)' 
Breakpoint 2 at 0xb7d24664 
(gdb) continue 
Continuing. 

Dann Haltepunkt passieren.

Stellen Sie sicher, dass Sie die Parameterliste in der Funktion angeben, in der Sie einen Haltepunkt festlegen möchten, ohne die Namen dieser Parameter, nur deren Typen.

+4

Danke an pholklore in #gdb in irc.freenode.net für diese Antwort. – Neil

+0

Sie können auch einfach einen Haltepunkt setzen, wie Sie möchten, ohne zuerst auf main() zu brechen, und gdb fragt Sie, ob Sie einen ausstehenden Haltepunkt setzen möchten. Auf diese Weise können Sie nie sicher sein, ob diese Funktion tatsächlich existiert oder ob Sie einen Tippfehler gemacht haben. So ist die in der Antwort dargestellte Methode sicherer. – Neil

+0

Dies behob einige seltsame Probleme, die ich hatte; Vielen Dank. – Qix

4

Der tatsächliche Fehler:

Error accessing memory address 0x5fc660: Input/output error.

Kann von 32/64 Bit mixups verursacht werden. Überprüfen Sie beispielsweise, dass Sie keine Verbindung zu einer 32-Bit-Binärdatei mit einer 64-Bit-Prozess-ID hergestellt haben oder umgekehrt.

+0

Ich habe dieses Problem, aber ich kann nicht herausfinden, wie es richtig gdb verwenden :( – froginvasion

+0

Und Bissigkeit-Mismatch ist nicht das Problem? –

+0

erscheint, dass ich die '-g' Option zum Makefile hinzufügen musste, und das hat das Problem behoben.Es wurde irgendwo auf Stackoverflow gefunden, aber ich weiß nicht, was es tut. – froginvasion

1

OK für mich habe ich das beim Bauen mit Mingw-W64 (native oder Cross-Compiler). Ich bin mir nicht sicher, was das genaue Problem war, aber wenn ich es mit gcc mingw-w64 i686-5.1.0-posix-sjlj-rt_v4-rev0 erstellen, dann erstellt es (endlich) debuggable Builds. Sonst

(gdb) break main 
... 
(gdb) r 
... 
Cannot insert breakpoint 1. 
Cannot access memory at address 0x42445c 
<process basically hangs> 

Nachricht 19 mal aus 20, obwohl es manchmal tatsächlich funktioniert (sehr selten).

gdb 7.8.1 und 7.9.1 schien in der Lage zu sein, die erstellte exe zu debuggen. Es ist also wahrscheinlich nicht die Version von gdb, die einen Unterschied macht.

Meine aktuelle Theorie/Verdächtige ist entweder die Version von gcc oder möglicherweise der sljl vs. dwarf2 "aspect" zum Compiler [?] (I686-492-posix-dwarf-rt_v3-rev1 hat nicht funktioniert, und Cross-Compiling mit irgendeiner Form von gcc 4.9.2 tat auch nicht). Habe keine anderen Versionen von gcc versucht.

update: neuere gcc (5.1.0) aber Cross Compiling Ich habe immer noch diesen Fehler. Die Ursache in dieser Fall erwies sich als eine Abhängigkeits-Bibliothek, die mein Build (FFmpeg) durch die Verknüpfung verwendet wurde (libgme in diesem Fall), die ein paar fehlerhafte "shared" Symbole exportiert (wenn ich eine statische ausführbare Datei erstellen) . Aus diesem Grund baut "shared" Bremsen (https://trac.ffmpeg.org/ticket/282) und irgendwie verschraubt es auch gdb.Zum Beispiel kann die mögliche Verbindung mit SDL Ihnen auch helfen. Mein Gedanke ist möglicherweise ein ld Bug [?]

Verwandte Themen