2017-01-25 1 views
0

Исполняемый файл, a.out, загружает общие библиотеки 1.so, 2.so и 3.so. В каждой из трех библиотек реализована функция func(). Когда вызывается func(), я хочу определить, какая реализация func() выполнена.Как определить общую библиотеку, функции которой в настоящее время исполняются исполняемым файлом

Я пробовал ltrace в PID исполняемого файла. Он отображает только вызов func(), но не общую библиотеку.

Любые предложения?

+0

Две подобные вопросы (но не точные дубликаты, имхо): HTTP://stackoverflow.com/questions/6538501/linking-two-shared-libraries-with-some-of-the-same-symbols http://stackoverflow.com/questions/29079742/same-symbols- in-different-libraries-and-linking-order – DyZ

+1

Если вам известен адрес функции, вы можете найти его на карте памяти процесса ('/ proc//maps'). –

+0

Я согласен «не дублировать», но если вы знаете порядок передачи библиотек компоновщику, вопросы очень сильно подразумевают, что он будет «func» с первого. –

ответ

0

Использование Systemtap:

probe process("/path/to/1.so").function("func") 
{ 
    printf("%d: 1.so\n", pid()); 
}  

probe process("/path/to/2.so").function("func") 
{ 
    printf("%d: 2.so\n", pid()); 
}  

probe process("/path/to/3.so").function("func") 
{ 
    printf("%d: 3.so\n", pid()); 
}  

Используйте его с:

sudo -E stap ./func.stap 

С Linux перфорация:

sudo perf probe -x /path/to/1.so func 
sudo perf probe -x /path/to/2.so func 
sudo perf probe -x /path/to/3.so func 
sudo perf top -e probe_1:func,probe_2:func,probe3:func 
Смежные вопросы