#c #gdb #shared-libraries #dll-injection
#c #gdb #разделяемые библиотеки #dll-внедрение
Вопрос:
Я использую Ubuntu 14.04
Я пытаюсь использовать https://github.com/KDE/heaptrack для обнаружения утечек памяти в моей запущенной программе на C
при запуске скрипта оболочки heaptrack
gdb --batch-silent -n -iex="set auto-solib-add off" -p $pid
--eval-command="sharedlibrary libdl"
--eval-command="call (void) dlmopen(0x00, "$LIBHEAPTRACK_INJECT", 0x002)"
--eval-command="sharedlibrary libheaptrack_inject"
--eval-command="call (void) heaptrack_inject("$pipe")"
--eval-command="detach"
я вижу следующие сообщения об ошибках
No symbol "dlmopen" in current context.
No symbol "heaptrack_inject" in current context.
и когда я запускаю gdb вручную
gdb -p XXX
(gdb) sharedlibrary libdl
я вижу другое сообщение об ошибке
No loaded shared libraries match the pattern `libdl'.
но libdl.so существует в моей файловой системе
# find / -name libdl*.so
/usr/lib/debug/lib/x86_64-linux-gnu/libdl-2.19.so
/usr/lib/x86_64-linux-gnu/libdl.so
/lib/x86_64-linux-gnu/libdl-2.19.so
Почему gdb не загружает libdl через команду sharedlibrary?
Ответ №1:
Почему gdb не загружает libdl через команду sharedlibrary?
Это сообщение:
No loaded shared libraries match the pattern `libdl'.
означает, что ваш низший (отлаживаемый) процесс не связывается с libdl
. Вы можете найти все библиотеки, которые есть у вашего подчиненного, (gdb) info shared
и подтвердить, что libdl
их среди них нет.
GDB сама по себе не изменяет набор загруженных библиотек.
find / -name libdl*.so
Это не имеет значения. libdl.so
Существует, но это не значит, что каждый процесс загружает его (ваш процесс не загружает).