Отладить после смерти дескриптор dlopen()?
У меня есть corefile и я хочу отладить дескриптор, возвращенный dlopen()
Например, убедитесь, что он все еще не поврежден. dlsym()
функция, вызванная на дескриптор, указывает this=0x0
в трассировке стека. Есть ли описание того, что стоит за dlopen()
справиться? Или я должен проверить libdl.so
исходный код?
2 ответа
Dlopen
возвращается NULL
если не удалось найти или загрузить библиотеку (в этом случае вам больше ничего не нужно отлаживать) или указатель на link_map
структура данных, которая определена в публичном заголовке Glibc link.h
(см. это, например).
dlopen(3) может потерпеть неудачу и дает NULL
в таком случае. И вы всегда должны проверять такой провал (см. Это). Я думаю, что некоторые 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)