Я запускаю программу с LD_PRELOADing отдельной библиотекой. Вот так.
LD_PRELOAD=./my.so ./my_program
Как запустить эту программу с помощью gdb?
Я запускаю программу с LD_PRELOADing отдельной библиотекой. Вот так.
LD_PRELOAD=./my.so ./my_program
Как запустить эту программу с помощью gdb?
Сделайте следующее.
gdb your_program
(gdb) set environment LD_PRELOAD=./yourso.so
(gdb) start
Проводка, потому что мы столкнулись с ситуацией, когда 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
Вот как запустить все (с аргументами и средой) как одну команду:
Пример:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
Острый наблюдатель заметит, что env
служит здесь как обертка exec (как ответ Алексея Романова).
В основном вы можете сделать это, просто добавьте 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! Библиотека не загружается, это означает, что ни один из ответов здесь не является полностью правильным, по крайней мере, с текущими инструментами.
Вы можете предоставить env
в качестве оболочки exec в командной строке с помощью флага -iex
:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program