我用LD_PRELOAD来运行一个程序来加载一个特定的库,就像这样。
LD_PRELOAD=./my.so ./my_program
如何使用gdb运行此程序?
gdb
rqenqsqc1#
请执行以下操作。
gdb your_program (gdb) set environment LD_PRELOAD ./yourso.so (gdb) start
lg40wkob2#
发帖是因为我们遇到了set environment不起作用的情况:从GDB documentation开始:
set environment
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
tnkciper3#
在一个命令中同时使用环境和参数:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
这使用env作为exec Package 器--功能上与Alexey Romanov的答案相同,但将其作为一个命令可以方便地从shell历史中重复。
env
ego6inou4#
您可以使用-iex标志在命令行上提供env作为exec-wrapper:
-iex
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
wh6knrhe5#
我使用的是带有VS代码的gdbserver,最简单的方法是启动 Package 在shell中的程序:
gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
piv4azn76#
基本上可以用同样的方法完成,只需在程序名前添加gdb:
LD_PRELOAD=./my.so gdb ./my.program
您可以使用以下命令检查环境变量:
(gdb) show environment LD_PRELOAD
在极少数情况下,您实际上需要在gdb中更改它,例如,在调试dlopen()时,您可以这样做:
dlopen()
(gdb) set environment LD_PRELOAD ./my.so
哦,等等,它对我的gdb 7.6.2不起作用!库没有被加载,这意味着这里的答案没有一个是完全正确的,至少在当前的工具中是这样。
6条答案
按热度按时间rqenqsqc1#
请执行以下操作。
lg40wkob2#
发帖是因为我们遇到了
set environment
不起作用的情况:从GDB documentation开始:
当设置了“exec-wrapper”时,指定的wrapper用于启动程序进行调试。gdb使用exec wrapper程序的shell命令启动程序。引号被添加到程序及其参数中,而不是添加到wrapper中,所以如果适合您的shell,您应该添加引号。wrapper运行直到它执行您的程序,然后gdb接管控制。
你可以使用任何一个最终调用execve的程序作为 Package 器。几个标准的Unix实用程序可以做到这一点,例如env和nohup。任何以exec“$@”结尾的Unix shell脚本也可以工作。
例如,您可以使用env将环境变量传递给调试的程序,而无需在shell的环境中设置该变量:
tnkciper3#
在一个命令中同时使用环境和参数:
这使用
env
作为exec Package 器--功能上与Alexey Romanov的答案相同,但将其作为一个命令可以方便地从shell历史中重复。ego6inou4#
您可以使用
-iex
标志在命令行上提供env
作为exec-wrapper:wh6knrhe5#
我使用的是带有VS代码的gdbserver,最简单的方法是启动 Package 在shell中的程序:
piv4azn76#
基本上可以用同样的方法完成,只需在程序名前添加
gdb
:您可以使用以下命令检查环境变量:
在极少数情况下,您实际上需要在gdb中更改它,例如,在调试
dlopen()
时,您可以这样做:哦,等等,它对我的gdb 7.6.2不起作用!库没有被加载,这意味着这里的答案没有一个是完全正确的,至少在当前的工具中是这样。