почему gdb не загружает libdl через sharedlibrady? и heaptrack не работает

#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 Существует, но это не значит, что каждый процесс загружает его (ваш процесс не загружает).