Подтвердить что ты не робот

Как использовать gdb с LD_PRELOAD

Я запускаю программу с LD_PRELOADing отдельной библиотекой. Вот так.

LD_PRELOAD=./my.so ./my_program

Как запустить эту программу с помощью gdb?

4b9b3361

Ответ 1

Сделайте следующее.

gdb your_program

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

Ответ 2

Проводка, потому что мы столкнулись с ситуацией, когда set environment не работал:

От Документация GDB:

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

Когда 'exec-wrapper установлен, указанная оболочка используется для запуска программ для отладки. gdb запускает вашу программу с помощью команды оболочки программы-оболочки exec. Цитата добавляется в программу и ее аргументы, но не в оболочку, поэтому вам следует добавлять кавычки, если это необходимо для вашей оболочки. Обертка выполняется до тех пор, пока она не выполнит вашу программу, а затем gdb возьмет управление.

Вы можете использовать любую программу, которая в итоге вызывает execve с ее аргументами в качестве обертки. Несколько стандартных утилит Unix делают это, например. env и nohup. Любая Unix-оболочка script, заканчивающаяся на exec "$ @", также будет работать.

Например, вы можете использовать env для передачи переменной среды в отладочную программу без установки переменной в среде оболочки:

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

Ответ 3

Вот как запустить все (с аргументами и средой) как одну команду:

Пример:

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

Острый наблюдатель заметит, что env служит здесь как обертка exec (как ответ Алексея Романова).

Ответ 4

В основном вы можете сделать это, просто добавьте 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! Библиотека не загружается, это означает, что ни один из ответов здесь не является полностью правильным, по крайней мере, с текущими инструментами.

Ответ 5

Вы можете предоставить env в качестве оболочки exec в командной строке с помощью флага -iex:

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