如何将gdb与LD_PRELOAD一起使用

时间:2012-05-04 11:47:41

标签: c linux gcc gdb x86-64

我在特定库中运行LD_PRELOAD程序。像这样。

LD_PRELOAD=./my.so ./my_program

如何使用gdb运行此程序?

5 个答案:

答案 0 :(得分:58)

执行以下操作。

gdb your_program

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

答案 1 :(得分:11)

发帖是因为我们遇到了set environment无效的案例:

来自GDB documentation

set exec-wrapper wrapper
show exec-wrapper
unset exec-wrapper
     

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

     

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

     

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

         (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so'
         (gdb) run

答案 2 :(得分:7)

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

示例:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l

敏锐的观察者会注意到env在这里作为exec包装器(如Alexey Romanov的答案)。

答案 3 :(得分:6)

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

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program

答案 4 :(得分:1)

您基本上可以这样做,只需在程序名称之前添加gdb

LD_PRELOAD=./my.so gdb ./my.program

您可以使用以下方法检查环境变量:

(gdb) show environment LD_PRELOAD

在极少数情况下,您确实需要在gdb中更改它,例如在调试dlopen()时,你可以这样做:

(gdb) set environment LD_PRELOAD ./my.so

哦,等等,gdb 7.6.2对我不起作用!图书馆没有加载,这意味着这里的答案都不完全正确,至少在现有工具中是这样。