How to use gdb with LD_PRELOAD
Solution 1
Do the following.
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
Solution 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
Solution 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).
Solution 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
Solution 5
I am using gdbserver with VS Code, the simplest way is launching your program wrapped in a shell:
gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
MetallicPriest
Updated on July 05, 2022Comments
-
MetallicPriest almost 2 years
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
?