Я полагаюсь на Uprobes для динамического c инструментария общей библиотеки. Хотя все, что мне нужно, отлично работает на системах x86, при работе с ядром Linux v4.14.x на 32-битной платформе ARM: плате Odroid XU4 появляются неожиданные ошибки. В настоящее время я использую ядро , предоставленное производителем платы (Hardkernel).
По существу, все зонды Systemtap в следующем формате не работают:
process(<PATH_TO_EXECUTABLE_OR_SHARED_LIB>).mark(<MARKER_NAME>)
process(<PATH_TO_EXECUTABLE_OR_SHARED_LIB).function(<FUNCTION_NAME>)
Пример для Исполняемый файл example_openmp_stap:
$ stap -e 'probe process("./example_openmp_stap").function("main") { printf("Hey\n")}' -c ./example_openmp_stap
WARNING: probe process("/tmp/example_openmp_stap").function("main") at inode-offset 165296:00000789 registration error (rc -22)
WARNING: task_finder mmap inode-uprobes callback for task 4989 failed: -22
...
В отличие от этого, некоторые функции "семейства" зондов процесса работают:
$ stap -e 'probe process("/tmp/example_openmp_stap").begin { printf("Program launched\n")}' -c ./example_openmp_stap
Program launched
Очевидно, функция ядра uprobe_register () - определена в kernel / события / uprobes. c - это тот, который терпит неудачу (он возвращает -EINVAL). Обратите внимание, что ядро было скомпилировано со всеми необходимыми символами:
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_UPROBES=y
CONFIG_UPROBE_EVENTS=y
Я скомпилировал и установил SystemTap из его GIT репозитория (последняя версия):
$ stap --version
Systemtap translator/driver (version 4.3/0.170, commit release-4.2-41-g0e1d5b7eb397 + changes)
Copyright (C) 2005-2019 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
tested kernel versions: 2.6.32 ... 5.4-rc6
enabled features: AVAHI BPF LIBSQLITE3 NLS NSS
Любая информация который проливает свет на то, как это исправить, будет с благодарностью!
PS .: Обратите внимание, что это не работает ни с ядрами 4.9.x, ни с 3.10.x.