2012-07-02 3 views
4

Я хотел бы отслеживать (отлаживать) динамическую библиотеку linux, написанную на C.
Я хочу посмотреть, когда и какие параметры передаются ему.monitor linux динамическая библиотека

Библиотека для мониторинга «X» вызывается другой динамической библиотекой «Y».
Оба «X» и «Y» отображаются в/proc/pid/maps исполняемого файла «A».

Использование ltrace в исполняемом файле не отображает lib X или Y.
Исполнитель исполняет несколько потоков.

Кроме того, при использовании команды LDD в Исполнительном он ничего не говорит о ЛИЭС X или Y.
LDD Y говоря, показывает, что Y нуждается в X.

Использование LDD на всех LIBS, Execs в проект не упоминает никого, кому понадобится Y.
Но Y, похоже, загружается в/proc/pid/maps exec.

Я не уверен, какие шаги я мог предпринять, чтобы отлаживать X lib, любые советы приветствуются.

+1

'Y' может быть загружен во время выполнения с помощью 'dlopen'. –

+2

'strace' должен обнаруживать загрузку файла библиотеки. – cdarke

+1

@KerrekSB Я вижу, что документация ltrace указывает, что 'Calls to dlopen() ed библиотек не будет прослеживаться.' – user756235

ответ

4

Если пользователь756235 может запускать его под gdb, то это подход с использованием this и this. Единственный вопрос, чтобы сделать полный список функций в общей библиотеке X: nm ./libX.so | grep "T "

А затем создать .gdbinit (в моем случае я управляю арг из print_in_lib):

host: srv2-x64rh5-01, OS: Linux 2.6.18-238.el5>more .gdbinit 
file main 
set pagination off 
set logging file gdb.txt 
set breakpoint pending on 
set logging on 
b print_in_lib 
commands 
info args 
continue 
end 
r 
set logging off 
quit 

И когда я бегу gdb :

хозяин: SRV2-x64rh5-01, ОС: Linux 2.6.18-238.el5> GDB -q Функция "print_in_lib" не определен. Точка останова 1 (print_in_lib) не ожидается. предупреждения: нет загружаемой секции найдены в добавленном символе-файл система поставляется в ДСО 0x2aaaaaaab000 тысячах: 1 print_debug: 0

1 Точка останова, print_in_lib (print_debug = 0, индекс = 0) в my_lib.cpp: 7 7 если (print_debug) {print_debug = 0 индекс = 0

1 Точка останова, print_in_lib (print_debug = 0, индекс = 1) при my_lib.cpp: 7 7 , если (print_debug) {print_debug = 0 = 1 индекса

Точка останова 1, print_in_lib (print_debug = 0, index = 2) в my_lib.cpp: 7 7 if (print_debug) {print_debug = 0 index = 2

1 Точка останова, print_in_lib (print_debug = 0, индекс = 3) при my_lib.cpp: 7 7 , если (print_debug) {print_debug = 0 индекс = 3

+0

Спасибо за отличный пост! – user756235