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?
Funciona bien para mí. Publica un código ¿Qué banderas estás pasando a 'dlopen'? –
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