Добавление динамической точки трассировки через perf в Linux для функции, которой нет в списке - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь отследить функцию zap_pte_range из mm / memory.c, используя perf. Но функция не указана в perf probe -F. Так есть ли способ динамически отслеживать эту функцию? То есть с явным добавлением точки трассировки и перекомпиляцией ядра?

perf probe -a zap_pte_range

дает:

[kernel.kallsyms] с идентификатором сборки 33b15ec444475ee7806331034772f61666fa6719 не найден, продолжение без символов

Не удалось найти символ zap_pte_range в ядре

Ошибка: не удалось добавить события.

1 Ответ

0 голосов
/ 22 ноября 2018

Нет такой точки следа.Очевидно, вы не можете отследить это простым способом.Похоже, что эта функция была встроена компилятором (имейте в виду, что функция также может быть опущена по некоторым причинам оптимизации).Вот почему в /proc/kallsyms.

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

Другой способ - это немного взломать.Вы можете сделать что-то вроде objdump -dS memory.o | vim - (у вас должны быть двоичные файлы) и выяснить, где код, который вам нужен.Учитывая, что цепь zap_pud_range() -> zap_pmd_range() -> zap_pte_range(), вероятно, встроена, вам придется исследовать вышеупомянутое unmap_page_range().Возможно, вы наконец-то получите кодовый адрес для kprobes .

Если вы хотите явно проследить zap_pte_range(), например, через jprobes (оargs) или kretprobes (о возвращаемом значении), вы можете попытаться указать noinline -атрибут для необходимых функций, перекомпилировать ядро ​​Linux и отследить его как хотите.

Думаю, у меня больше нет для вас полезных способов.

Дополнительная информация: Связанный пост , Пример Jprobes , Ftrace: отслеживание вашего ядрафункции! , Пост о ftrace и systemtap , man nm

...