2009-05-26 23 views
5

me escribió un programa muy simple Qt aquí:Después de establecer un punto de interrupción en Qt, el BGF dice: "Error de acceso a la dirección de memoria"

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

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

    return app.exec(); 
} 

Y cuando intento para establecer un punto de interrupción en la mesa recibe se hace clic, me sale este error de 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. 

¿alguien sabe por qué no se puede insertar el punto de ruptura?

+0

Estoy usando Ubuntu Intrepid, y he instalado libqt4-dbg, si eso ayuda en absoluto. – Neil

Respuesta

2

Si desea dividirse automáticamente en main sin establecer un punto de interrupción, también puede usar el comando start.
Si es necesario proporcionar ningún argumento para el programa que puede utilizar:
start argument1 argument2

11

No utilice el comando gdb symbol-file para cargar símbolos externos. Las direcciones de punto de interrupción serán incorrectas ya que no se reubican.

lugar, poner un punto de interrupción en main, ejecute el programa, y ​​luego configurar su punto de ruptura:

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. 

luego hacer su punto de interrupción ocurra.

Asegúrese de especificar la lista de parámetros en la función en la que desea establecer un punto de interrupción, sin los nombres de esos parámetros, solo sus tipos.

+4

Gracias a pholklore en #gdb en irc.freenode.net por esta respuesta. – Neil

+0

También puede establecer simplemente un punto de interrupción en lo que desee sin romper en main() primero, y gdb le preguntará si desea establecer un punto de interrupción pendiente. Sin embargo, de esta manera nunca se puede estar seguro de si esa función existe o si se cometió un error tipográfico. Entonces el método ilustrado en la respuesta es más seguro. – Neil

+0

Esto solucionó algunos problemas extraños que estaba teniendo; Gracias. – Qix

4

El error real:

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

puede ser causada por mixups 32/64 bits. Compruebe, por ejemplo, que no se conectó a un binario de 32 bits con una identificación de proceso de 64 bits, o viceversa.

+0

Tengo este problema, pero no puedo entender cómo hacer que use gdb correctamente :( – froginvasion

+0

Y la discrepancia de bits no es el problema? –

+0

Parece que tuve que agregar la opción '-g' al archivo MAKE, y eso solucionó el problema. Lo encontré en algún lugar en stackoverflow, pero no sé lo que hace. – froginvasion

1

OK para mí Obtuve esto cuando construyo con mingw-w64 (compilador nativo o cruzado). No estoy seguro de cuál fue el problema exacto, pero si lo construyo usando gcc mingw-w64 i686-5.1.0-posix-sjlj-rt_v4-rev0 entonces crea (finalmente) versiones depurables. De lo contrario

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

mensaje de 19 veces de cada 20, aunque a veces no funcionan realmente (muy rara vez).

gdb 7.8.1 y 7.9.1 parecían poder depurar el exe creado. Entonces probablemente no sea la versión de gdb lo que haga la diferencia.

Mi teoría/sospechoso actual es o bien era la versión de gcc o posiblemente el "aspecto" sljl vs. dwarf2 del compilador [?] (I686-492-posix-dwarf-rt_v3-rev1 no funcionaba, y la compilación cruzada con alguna forma de gcc 4.9.2 tampoco). No probé otras versiones de gcc.

actualización: más reciente gcc (5.1.0) pero compilación cruzada Todavía tengo este error. La causa en este caso resultó ser una biblioteca de dependencias que mi compilación (FFmpeg) estaba utilizando vinculando contra (libgme en este caso) que está exportando algunos símbolos "compartidos" errantes (cuando estoy construyendo un ejecutable estático) . Debido a esto, el freno de construcciones "compartidas" (https://trac.ffmpeg.org/ticket/282) y de alguna manera también daña gdb.Por ejemplo, posiblemente la vinculación con SDL también puede hacer esto. Mi pensamiento es posiblemente un error ld [?]

Cuestiones relacionadas