我在特定库中运行LD_PRELOAD程序。像这样。
LD_PRELOAD=./my.so ./my_program
如何使用gdb运行此程序?
答案 0 :(得分:58)
执行以下操作。
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
答案 1 :(得分:11)
发帖是因为我们遇到了set environment
无效的案例:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper
设置'exec-wrapper'时,指定的包装器用于启动调试程序。 gdb使用表单exec包装程序的shell命令启动程序。引用被添加到程序及其参数中,但不包含在包装器中,因此如果适合您的shell,则应添加引号。包装器运行直到它执行你的程序,然后gdb才能控制。
您可以使用最终调用execve的任何程序及其参数作为包装器。几个标准的Unix实用程序会这样做env和nohup。任何Unix shell脚本以exec" $ @"结尾也会有用。
例如,您可以使用env将环境变量传递给调试的程序,而无需在shell的环境中设置变量:
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
答案 2 :(得分:7)
这是一种将所有东西(带参数和环境)作为一个命令运行的方法:
示例:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
敏锐的观察者会注意到env
在这里作为exec包装器(如Alexey Romanov的答案)。
答案 3 :(得分:6)
您可以使用env
标志在命令行上提供-iex
作为exec-wrapper:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
答案 4 :(得分:1)
您基本上可以这样做,只需在程序名称之前添加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对我不起作用!图书馆没有加载,这意味着这里的答案都不完全正确,至少在现有工具中是这样。