67

我运行一个带有 LD_PRELOADing 特定库的程序。像这样。

LD_PRELOAD=./my.so ./my_program

我如何运行这个程序gdb

4

6 回答 6

77

请执行下列操作。

gdb your_program

(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
于 2012-05-04T11:54:17.793 回答
17

发帖是因为我们遇到了一个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
于 2017-01-24T07:39:38.413 回答
13

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

例子:

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

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

于 2017-07-20T10:40:39.760 回答
10

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

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
于 2017-11-14T13:18:43.330 回答
1

我将 gdbserver 与 VS Code 一起使用,最简单的方法是启动包装在 shell 中的程序:

gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
于 2021-08-27T07:28:05.387 回答
0

你基本上可以这样做,只需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 对我不起作用!该库没有被加载,这意味着这里的答案都不完全正确,至少使用当前工具。

于 2014-10-22T08:39:59.923 回答