Отладить после смерти дескриптор dlopen ()? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть corefile, и я хочу отладить дескриптор, возвращенный dlopen(), например, проверить, что он все еще не поврежден.Функция dlsym(), вызванная для дескриптора, указывает this=0x0 в трассировке стека.Есть ли описание того, что за ручкой dlopen()?Или я должен проверить исходный код libdl.so?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Dlopen возвращает NULL, если не удалось найти или загрузить библиотеку (в этом случае вам больше ничего не нужно отлаживать) или указатель на link_map структуру данных, которая определена в общедоступном заголовке Glibc link.h (см. это например).

0 голосов
/ 23 мая 2018

dlopen (3) может дать сбой и в этом случае дает NULL.И вы должны всегда проверять такой сбой (см. this ).Я предполагаю, что некоторые dlopen потерпели неудачу в вашем случае, но вы забыли проверить это (это может объяснить ваш this=0, о котором сообщали gdb в dlsym).Тем не менее, в Linux вы можете сделать сотни тысяч успешных dlopen -s, см. Мой пример manydl.c .Конечно, вы не должны использовать dlsym (3) с NULL дескриптором общего объекта (в противном случае это неопределенное поведение , с вероятной ошибкой сегментации ).

Чтобы найти, в частности, в Linux, по какому-либо адресу, к какой функции он может принадлежать, вы можете использовать dladdr (3) .

Обратите внимание, что core (5) Файлы знают о сегментах памяти mmap (если, возможно, они неполные, поскольку вы достигли некоторого предела, установленного с помощью setrlimit (2) с использованием RLIMIT_CORE)

Смотрите также proc (5) .Если вы можете воспроизвести вашу ошибку в каком-то процессе 1234, посмотрите на /proc/1234/maps, пока этот процесс все еще активен.

Где-то есть описание того, что скрывается за дескриптором dlopen ()?

Это некоторый абстрактный тип данных (используется только с dlopen, dlsym, dlclose и dlinfo (3) ... см. Также dl_iterate_phdr (3) .), Поэтому переносные программы не нуждаются в уходе.Конечно, вы можете изучить реализацию dlopen, например, внутри исходного кода GNU libc .См. Также /usr/include/link.h вашей системы и struct link_map (спасибо yugr комментарий)

...