2012-05-04 18 views
35

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?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - ¿hay algo allí que ayude? – Mat

Respuesta

52

Haga lo siguiente.

gdb your_program 

(gdb) set environment LD_PRELOAD ./yourso.so 
(gdb) start 
0

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.

+0

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.). –

5

Publicación porque nos encontramos con un caso en el que set environment no funcionó:

De GDB documentation:

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 
4

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).

1

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 
+0

esta versión funcionó bien donde algunas otras respuestas no funcionaron o no fueron fáciles de usar. – Guillaume