How to use gdb with LD_PRELOAD

依然范特西╮ 提交于 2019-11-28 18:27:10

问题


I run a program with LD_PRELOADing a specific library. Like this.

LD_PRELOAD=./my.so ./my_program

How do I run this program with gdb?


回答1:


Do the following.

gdb your_program

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



回答2:


Posting because we ran into a case where set environment didn't work:

From GDB documentation:

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

When ‘exec-wrapper’ is set, the specified wrapper is used to launch programs for debugging. gdb starts your program with a shell command of the form exec wrapper program. Quoting is added to program and its arguments, but not to wrapper, so you should add quotes if appropriate for your shell. The wrapper runs until it executes your program, and then gdb takes control.

You can use any program that eventually calls execve with its arguments as a wrapper. Several standard Unix utilities do this, e.g. env and nohup. Any Unix shell script ending with exec "$@" will also work.

For example, you can use env to pass an environment variable to the debugged program, without setting the variable in your shell's environment:

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



回答3:


Here is a way to run everything (with arguments and environment) as one command:

Example:

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

The keen observer will notice that env serves here as an exec wrapper (like Alexey Romanov's answer).




回答4:


You can supply env as an exec-wrapper on the command line using the -iex flag:

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



回答5:


You can basically do it the same way, just add gdb before the program name:

LD_PRELOAD=./my.so gdb ./my.program

You can check the environment variables using:

(gdb) show environment LD_PRELOAD

In the rare case you actually need to change it inside gdb, e.g. when debugging a dlopen(), you ca do that:

(gdb) set environment LD_PRELOAD ./my.so

Oh, wait, it doesn't work for me with gdb 7.6.2! The library doesn't get loaded, that means none of the answer here are entirely correct, at least with current tools.



来源:https://stackoverflow.com/questions/10448254/how-to-use-gdb-with-ld-preload

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!