Perf динамическая трассировка Не удалось добавить события

Я пытаюсь научиться использовать динамическую трассировку производительности в моем java-приложении, в котором запущена некоторая общая библиотека на основе JNI, написанная на C. Библиотека устанавливается по пути /opt/myapp/lib/libmyapp.so, а затем запускается с параметром -Djava.library.path=/opt/myapp/lib/. Итак, я запускаю следующую команду:

root@mypc:~# perf probe -x /opt/myapp/lib/libmyapp.so --add Java_net_my_app_pollEvents0
    Error: Failed to add events.

без намека на причину ошибки. Если бы в библиотеке не было глобальной функции с таким именем, я бы получил соответствующее описание ошибки:

root@mypc:~# perf probe -x /opt/myapp/lib/libmyapp.so --add Java_net_my_app_pollEvents1234567
Probe point 'Java_net_my_app_pollEvents1234567' not found.
    Error: Failed to add events.

Кто-нибудь может подсказать, как это исправить? Я попытался добавить зонд для функции malloc, и он отлично работает:

root@mypc:~# perf probe -x /lib/x86_64-linux-gnu/libc-2.27.so --add malloc
Added new event:
  probe_libc:malloc    (on malloc in /lib/x86_64-linux-gnu/libc-2.27.so)

You can now use it in all perf tools, such as:

        perf record -e probe_libc:malloc -aR sleep 1

Я не пробовал perf probe с JNI, но вместо этого могу предложить асинхронный профайлер. Он может легко отслеживать нативные функции, захватывая смешанную (нативную + Java) трассировку стека. Просто попробуйте profiler.sh -e Java_net_my_app_pollEvents0

apangin 29.05.2019 22:12

@apangin Не имеет прямого отношения к вопросу, но возможно ли с помощью асинхронного профилировщика сделать что-то вроде «увеличения общего объекта»? Или есть другой способ проверить трассировки стека, связанные с конкретным так?

St.Antario 30.05.2019 00:43

Не сейчас, но этого довольно легко добиться с минимальными изменениями. Вы можете открыть тикет в async-profiler, если хотите, и мы обсудим это там.

apangin 30.05.2019 11:56

У меня была такая же пустая ошибка, когда я пытался поместить зонд на очень длинное искаженное имя. Я вспомнил, что perf может скрыть некоторые ошибки, если вы не запустите его с -v (или, возможно, perf --debug verbose=10). Я запустил с -v и получил реальную ошибку: Error: Failed to add events. Reason: Argument list too long (Code: -7). Я не думаю, что это была ошибка в вашем случае, но всегда запускайте команды perf с -v, если они не работают должным образом.

Jong 26.04.2020 01:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В моем случае ошибка «слишком длинный список аргументов» возникла из-за того, что я передавал очень длинное искаженное имя символа C++ в perf probe; явное наименование контрольной точки с помощью синтаксиса EVENT= позволило успешно добавить контрольную точку:

$ sudo perf probe -x myelf --no-demangle --add myalias=_SomeVeryLongMangledNameWhee
$ sudo perf record -e 'probe_myelf:myalias' -a -- sleep 30

Другие вопросы по теме