2008-09-17 3 views
24

У меня есть файл ядра, сгенерированный в удаленной системе, к которой у меня нет прямого доступа. У меня также есть локальные копии файлов библиотеки из удаленной системы и исполняемый файл для программы сбоев.Как добавить каталог в путь библиотеки при загрузке основного файла в gdb на Linux

Я хотел бы проанализировать этот основной дамп в gdb.

Например:

gdb path/to/executable path/to/corefile 

Мои библиотеки в текущем каталоге.

В прошлом я видел, как отладчики реализовали это, предоставив опцию «-p». или "-p/=."; поэтому мой вопрос:

Как я могу указать, что библиотеки загружаются сначала из путей относительно моего текущего каталога при анализе corefile в gdb?

ответ

39

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

set solib-absolute-prefix ./usr 
file path/to/executable 
core-file path/to/corefile 

Вы должны убедиться, что зеркало вашего пути к библиотеке именно из целевой системы. Вышеупомянутое предназначено для отладки целей, которые не соответствуют вашему хосту, поэтому важно реплицировать структуру корневой файловой системы, содержащую ваши библиотеки.

Если удаленные отладки сервера, который является такой же архитектурой и Linux/версия Glibc в качестве хоста, то вы можете сделать, как fd предложил:

set solib-search-path <path> 

Если вы пытаетесь переопределить некоторые из библиотек , но не все, то вы можете скопировать структуру каталога целевой библиотеки во временное место и использовать решение solib-absolute-prefix, описанное выше.

+0

Я немного ошибался, поэтому вы можете обновить свой ответ до соответствия. Я отвечу на этот ответ, потому что он частично соответствует моему требованию, но я должен более четко заявить, что хочу добавить место в путь библиотеки, а не заменять его (мой плохой для использования слова «переопределить»). – 2008-09-17 15:42:10

+0

Спасибо, это действительно помогло мне! – 2010-09-29 16:41:38

+0

В моем случае исполняемый файл и его библиотеки находились в дереве, монтированном в NFS, и хостом, который я хотел отлаживать, был NFS-сервер, поэтому я помещал символическую ссылку в дерево, чтобы solib-absolute-prefix nfs-share-tree был точное решение. Надеюсь, это поможет будущим поколениям. – 2012-06-05 18:21:30

3

Я нашел этот отрывок на developer.apple.com

set solib-search-path path 

Если эта переменная установлена, путь является двоеточиями список каталогов для поиска разделяемых библиотек. solib-search-path' is used after solib-absolute-prefix 'не может найти библиотеку, или если путь к , библиотека относительна вместо . Если вы хотите использовать solib-search-path' instead of solib-absolute-prefix ', убедитесь, что установите `solib-absolute-prefix' в каталог noxistant , чтобы GDB не находил библиотеки вашего хоста.

EDIT:

Я не думаю, что с помощью выше настройка присоединяет каталогов Я добавил, но это, кажется, добавляет их, так что файлы, отсутствующие в моей нынешней системы подбираются в пути Я добавил. Я полагаю, что установка префикса solib-absolute-pre-to-to-fog и добавление каталогов в пути solib-поиска в том порядке, в котором я нуждаюсь, может быть полным решением.

4

Я не уверен, что это возможно вообще в gdb, но тогда я не эксперт.

Однако я могу прокомментировать динамический компоновщик Linux Linux. Следующее должно печатать путь для всех разрешенных разделяемых библиотек и неразрешенных.

ldd path/to/executable 

Нам нужно знать, как ваши общие библиотеки были связаны с вашим исполняемым файлом. Для этого используйте следующую команду:

readelf -d path/to/executable | grep RPATH 
  • Должен ли команда печати ничего, динамический компоновщик будет использовать стандартные места плюс переменная окружения LD_LIBRARY_PATH, чтобы найти общие библиотеки.

  • Если команда печатает некоторые строки, динамический компоновщик будет игнорировать LD_LIBRARY_PATH и вместо этого использовать hardcoded rpaths.

    Если перечисленные пути Rpath являются абсолютными, единственное решение, которое я знаю, это копирование (или символическая ссылка) ваших библиотек в указанные местоположения.

    Если перечисленные rpath являются относительными, они будут содержать $ ORIGIN, который будет заменен во время выполнения по пути исполняемого файла. Переместите либо исполняемый файл, либо библиотеки для соответствия.

Для получения более подробной информации, вы можете начать с:

man ld.so 
0

Одно важное замечание:

если вы делаете кросс-компиляцию и пытается отладить с помощью GDB, то после вы сделали
file ECECUTABLE_NAME если вы видите что-л. например:

Using host libthread_db library "/lib/libthread_db.so.1" 

затем проверьте, есть ли у вас libthread_db для вашей целевой системы. Я нашел много подобных проблем в Интернете. Такая проблема не может быть решена только с помощью «set solib-», вам нужно построить libthread_db, используя ваш кросс-компилятор.

2

Вы также можете просто установить LD_PRELOAD для каждой из библиотек или LD_LIBRARY_PATH в текущую директорию при вызове gdb. Это вызовет проблемы только в том случае, если сам gdb пытается использовать любую из предварительно загружаемых вами библиотек.

Смежные вопросы