如何将gdb与LD_PRELOAD一起使用

Met*_*est 47 c linux gcc gdb x86-64

我用LD_PRELOADing一个特定的库来运行一个程序.像这样.

LD_PRELOAD=./my.so ./my_program
Run Code Online (Sandbox Code Playgroud)

如何使用gdb运行此程序?

Met*_*est 61

请执行下列操作.

gdb your_program

(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
Run Code Online (Sandbox Code Playgroud)


Ale*_*nov 14

发布是因为我们碰到了一个set environment无效的案例:

GDB文档:

set exec-wrapper wrapper
show exec-wrapper
unset exec-wrapper
Run Code Online (Sandbox Code Playgroud)

设置'exec-wrapper'时,指定的包装器用于启动程序以进行调试.gdb使用表单exec包装程序的shell命令启动程序.引用被添加到程序及其参数中,但不包含在包装器中,因此如果适合您的shell,则应添加引号.包装器运行直到它执行你的程序,然后gdb控制.

您可以使用最终调用execve的任何程序及其参数作为包装器.几个标准的Unix实用程序可以做到这一点,例如env和nohup.任何以exec"$ @"结尾的Unix shell脚本也会起作用.

例如,您可以使用env将环境变量传递给调试的程序,而无需在shell的环境中设置变量:

         (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so'
         (gdb) run
Run Code Online (Sandbox Code Playgroud)


use*_*284 8

这是一种将所有东西(带参数和环境)作为一个命令运行的方法:

例:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
Run Code Online (Sandbox Code Playgroud)

敏锐的观察者会注意到env这里作为一个exec包装器(如Alexey Romanov的回答).


eca*_*mur 6

您可以env使用-iex标志在命令行上提供exec-wrapper :

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
Run Code Online (Sandbox Code Playgroud)