linux 如何将gdb与LD_PRELOAD一起使用

2wnc66cl  于 2022-12-03  发布在  Linux
关注(0)|答案(6)|浏览(208)

我用LD_PRELOAD来运行一个程序来加载一个特定的库,就像这样。

LD_PRELOAD=./my.so ./my_program

如何使用gdb运行此程序?

rqenqsqc

rqenqsqc1#

请执行以下操作。

gdb your_program

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

lg40wkob2#

发帖是因为我们遇到了set environment不起作用的情况:
GDB documentation开始:

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

当设置了“exec-wrapper”时,指定的wrapper用于启动程序进行调试。gdb使用exec wrapper程序的shell命令启动程序。引号被添加到程序及其参数中,而不是添加到wrapper中,所以如果适合您的shell,您应该添加引号。wrapper运行直到它执行您的程序,然后gdb接管控制。
你可以使用任何一个最终调用execve的程序作为 Package 器。几个标准的Unix实用程序可以做到这一点,例如env和nohup。任何以exec“$@”结尾的Unix shell脚本也可以工作。

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

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

tnkciper3#

在一个命令中同时使用环境和参数:

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

这使用env作为exec Package 器--功能上与Alexey Romanov的答案相同,但将其作为一个命令可以方便地从shell历史中重复。

ego6inou

ego6inou4#

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

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

wh6knrhe5#

我使用的是带有VS代码的gdbserver,最简单的方法是启动 Package 在shell中的程序:

gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
piv4azn7

piv4azn76#

基本上可以用同样的方法完成,只需在程序名前添加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不起作用!库没有被加载,这意味着这里的答案没有一个是完全正确的,至少在当前的工具中是这样。

相关问题