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