2010-04-15 18 views
9

Tengo una biblioteca compartida libtest.so que se cargará en el programa principal utilizando dlopen. La función test() reside en libtest.so y se llamará en el programa principal a través del dlsym. ¿Hay alguna manera de configurar un punto de ruptura en test?cómo establecer el punto de interrupción en la función en una biblioteca compartida que no se ha cargado en gdb

Tenga en cuenta que el programa principal no se ha vinculado a libtest.so durante el tiempo de enlace. De lo contrario, debería ser capaz de establecer el punto de ruptura aunque sea una acción pendiente. En mi caso, cuando hago b test, gdb me dirá Function "test" not defined.

+0

Podría establecer un punto de interrupción en '' test' después de cargar libtest.so' con 'dlopen'? –

Respuesta

11

En realidad gdb debe decir que es capaz de resolver el símbolo en el futuro, cuando las nuevas bibliotecas se cargan:

(gdb) b test 
Function "test" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (test) pending. 
(gdb) r 

Y más adelante, una vez que se carga el objeto .so, se resolverá el punto de interrupción, por ejemplo:

Reading symbols for shared libraries . done 
Breakpoint 1 at 0xcafebebe 
Pending breakpoint 1 - "test" resolved 
+0

En el GDB que estoy usando, incluso si "configuro un punto de interrupción pendiente en" NO me preguntará si quiero el comportamiento pendiente si el símbolo no está definido. Simplemente me dice "No puedo encontrar miembro bla bla Sugerencia prueba tab bla bla" –

6

En realidad, este método no siempre funcionará.

Supongamos que tengo varias bibliotecas compartidas que tienen cada una una función llamada "Init". Si he cargado una biblioteca diferente, entonces "b Init" establecerá el punto de interrupción en la instancia incorrecta de la función "Init". Así que tengo que especificar el punto de interrupción de la siguiente manera:

(BGF) b object5.c: 66

Ningún archivo de origen denominado object5.c.

+0

En mi caso, el problema que encontré es que tengo que compilar con símbolos de depuración (para poner puntos de interrupción en un .so personalizado). –

1

cómo establecer un punto de interrupción en una lib compartida.

[Es bastante común tener un punto de interrupción dentro de una biblioteca compartida. Las bibliotecas compartidas se pueden cargar y descargar explícitamente, y posiblemente repetidamente, a medida que se ejecuta el programa. Para admitir este caso de uso, gdb actualiza las ubicaciones de puntos de interrupción cada vez que se carga o descarga una biblioteca compartida. Normalmente, establecería un punto de interrupción en una biblioteca compartida al comienzo de la sesión de depuración, cuando la biblioteca no esté cargada y cuando los símbolos de la biblioteca no estén disponibles. Cuando se intenta establecer punto de interrupción, el BGF le preguntará si desea establecer una llamada en espera punto de interrupción punto de interrupción cuya dirección aún no se ha resuelto.]

cita de https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(BGF) b object5.c: 66 Ningún archivo fuente llamado object5.c.

tal vez usted puede usar "set the_location_of_object5.c_file directorio" para solucionarlo.

  • elemento de la lista
0

Otra forma es especificar el nombre de archivo y la función der, por ejemplo .:

b object5.c:test 

Esto debe ser único.Tal vez usted quiere también para especificar la ruta de acceso al código fuente (como ya se ha sugerido) por:

set directories path_of_object5.c 
Cuestiones relacionadas