【发布时间】:2012-05-13 23:08:23
【问题描述】:
我运行一个带有 LD_PRELOADing 特定库的程序。像这样。
LD_PRELOAD=./my.so ./my_program
如何使用gdb 运行这个程序?
【问题讨论】:
我运行一个带有 LD_PRELOADing 特定库的程序。像这样。
LD_PRELOAD=./my.so ./my_program
如何使用gdb 运行这个程序?
【问题讨论】:
我在 VS Code 中使用 gdbserver,最简单的方法是启动你的程序,包裹在 shell 中:
gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
【讨论】:
执行以下操作。
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
【讨论】:
这是一种将所有内容(带有参数和环境)作为一个命令运行的方法:
例子:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
敏锐的观察者会注意到 env 在这里充当 exec 包装器(就像 Alexey Romanov 的回答一样)。
【讨论】:
您可以使用 -iex 标志在命令行上将 env 作为 exec-wrapper 提供:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
【讨论】:
发布是因为我们遇到了set environment 不起作用的情况:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper当设置了'exec-wrapper'时,指定的包装器用于启动程序进行调试。 gdb 使用 exec wrapper program 形式的 shell 命令启动您的程序。引号会添加到程序及其参数中,但不会添加到包装器中,因此您应该在适合您的 shell 时添加引号。包装器一直运行,直到它执行您的程序,然后 gdb 获得控制权。
您可以使用任何最终调用 execve 及其参数的程序作为包装器。几个标准的 Unix 实用程序可以做到这一点,例如环境和nohup。任何以 exec "$@" 结尾的 Unix shell 脚本也可以工作。
例如,您可以使用 env 将环境变量传递给被调试程序,而无需在 shell 的环境中设置该变量:
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
【讨论】:
你基本上可以这样做,只需在程序名称前添加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 不适用于我!库没有被加载,这意味着这里没有一个答案是完全正确的,至少在当前的工具中是这样。
【讨论】:
open() 等的模拟库 - 例如 fakeroot 等)。