Ejecuto un programa con LD_PRELOADuna biblioteca específica. Me gusta esto.Cómo usar gdb con LD_PRELOAD
LD_PRELOAD=./my.so ./my_program
¿Cómo ejecuto este programa con gdb?
Ejecuto un programa con LD_PRELOADuna biblioteca específica. Me gusta esto.Cómo usar gdb con LD_PRELOAD
LD_PRELOAD=./my.so ./my_program
¿Cómo ejecuto este programa con gdb?
Haga lo siguiente.
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
Es, básicamente, puede hacerlo de la misma manera, sólo tiene que añadir gdb
antes de que el nombre del programa:
LD_PRELOAD=./my.so gdb ./my.program
Puede comprobar las variables de entorno usando:
(gdb) show environment LD_PRELOAD
En el raro caso realmente necesitas cambiarlo dentro de gdb, por ejemplo cuando se depura un dlopen()
, que ca hace eso:
(gdb) set environment LD_PRELOAD ./my.so
Oh, espera, no funciona para mí con GDB 7.6.2! La biblioteca no se carga, eso significa que ninguna de las respuestas aquí es completamente correcta, al menos con las herramientas actuales.
Supongo que el efecto de la precarga no es deseable para GDB en sí (tal vez es una biblioteca burlona que modifica 'open()' y similares, como 'fakeroot', etc.). –
Publicación porque nos encontramos con un caso en el que set environment
no funcionó:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper
Cuando se establece 'exec-wrapper', la envoltura especificado se utiliza para el lanzamiento programas para la depuración. gdb inicia su programa con un comando de shell del programa wrapper form exec. Las cotizaciones se agregan al programa y sus argumentos, pero no a la envoltura, por lo que debe agregar las cotizaciones, si corresponde, para su caparazón. El contenedor se ejecuta hasta que ejecuta su programa, y luego gdb toma el control.
Puede utilizar cualquier programa que finalmente llame a execve con sus argumentos como un contenedor. Varias utilidades estándar de Unix hacen esto, p. env y nohup. Cualquier script de shell de Unix que termine con el comando "$ @" también funcionará.
Por ejemplo, puede utilizar env para pasar una variable de entorno para el programa depurado, sin establecer la variable de entorno de su cáscara:
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
Aquí es una forma de ejecutar todo (con argumentos y medio ambiente) como un comando:
Ejemplo:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
El observador atento notará que env
sirve aquí como un contenedor de exec (como la respuesta de Alexey Romanov).
Puede suministrar env
como un ejecutivo-envoltura en la línea de comandos utilizando el -iex
bandera:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
esta versión funcionó bien donde algunas otras respuestas no funcionaron o no fueron fáciles de usar. – Guillaume
http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - ¿hay algo allí que ayude? – Mat