x32 - gcc x86 on x64



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

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

Пример:

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

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

https://src-bin.com

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

LD_PRELOAD=./my.so ./my_program

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


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


Answer #2

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

Из документации GDB :

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

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

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

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

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

Answer #3

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

gdb your_program

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




x86-64