2010-12-08 9 views
8

Quiero depurar un proceso que se ejecuta en Linux 2.6 usando GDB. attach PID (donde PID es la ID del proceso), print main, print sin, print gzopen y print dlopen funcionan (es decir, encuentran los símbolos respectivos). Pero print myfoo no funciona, donde myfoo es una función cargada por el proceso desde un archivo .so utilizando dlopen. Esto es lo que sale:¿Cómo hacer que gdb imprima símbolos en bibliotecas compartidas cargadas con dlopen?

(gdb) print main 
$3 = {int (int, char **)} 0x805ba90 <main> 
(gdb) print sin 
$4 = {<text variable, no debug info>} 0xb77<sin> 
(gdb) print gzopen 
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen> 
(gdb) print dlopen 
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck> 
(gdb) print myfoo 
No symbol "myfoo" in current context. 

¿Cómo llego BGF para encontrar myfoo?

La función myfoo sí existe, porque en el programa logré obtener su dirección usando dlsym (después de dlopen), y logré llamarla. Solo después de eso adjunté GDB al proceso.

Resultó que había un mensaje de error mydir/mylib.so: No such file or directory impreso por el comando attach $PID de GDB. Aparentemente GDB se inició en el directorio incorrecto. Hacer el correcto cd antes de iniciar GDB solucionó el problema, y ​​print myfoo comenzó a funcionar.

Me gustaría automatizar esto: quiero que GDB descubra dónde están mis archivos .so (cargados con dlopen). Una aproximación que puedo pensar es examinar /proc/$PID/maps (en Linux), encontrar posibles directorios y agregarlos a la ruta de búsqueda de la biblioteca GDB antes de iniciar GDB. Extendiendo LD_LIBRARY_PATH y haciendo un set solib-search-path /tmp/parent no funcionó (ls -l /tmp/parent/mydir/myfoo.so funciona), GDB todavía informó el No such file or directory. ¿Cómo le digo a GDB dónde buscar mydir/myfoo.so?

Mi otra pregunta es ¿cómo obtengo la lista de posibles directorios? En Linux, /proc/$PID/maps los contiene, pero ¿qué ocurre con otros sistemas operativos como FreeBSD y Mac OS X?

+0

Funciona bien para mí. Publica un código ¿Qué banderas estás pasando a 'dlopen'? –

+0

Hmm, navegando a través de los mensajes de error GDB al adjuntar, he encontrado 'mylib.so: No such such file or directory'. Después de hacer el 'cd' apropiado antes de iniciar GDB,' print myfoo' comenzó a funcionar. Pero me gustaría automatizar eso (por lo que 'cd' no es obligatorio). He ampliado la pregunta. – pts

Respuesta

0

Parece que no hay una forma fácil de automatizar la búsqueda de encontrar .so archivos en GDB.

0

Mantengo un programa que carga una biblioteca compartida a través de dlopen() y ha accedido exitosamente a símbolos en la biblioteca compartida usando GDB. Sin embargo, esto solo funcionará si la biblioteca compartida tiene una tabla de símbolos.

+0

Sí, también funciona para mí si comienzo GDB desde el directorio correcto. He ampliado la pregunta sobre la automatización de eso. – pts

3

comando "info target" en gdb mostrará una lista de todas las secciones en todos los objetos compartidos cargados (incluidas las bibliotecas ed dlopen). Al menos esto funciona en Linux: no sé cómo se comporta en otros sistemas operativos.

Cuestiones relacionadas