Я пытаюсь научиться использовать динамическую трассировку производительности в моем 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
@apangin Не имеет прямого отношения к вопросу, но возможно ли с помощью асинхронного профилировщика сделать что-то вроде «увеличения общего объекта»? Или есть другой способ проверить трассировки стека, связанные с конкретным так?
Не сейчас, но этого довольно легко добиться с минимальными изменениями. Вы можете открыть тикет в async-profiler, если хотите, и мы обсудим это там.
У меня была такая же пустая ошибка, когда я пытался поместить зонд на очень длинное искаженное имя. Я вспомнил, что perf
может скрыть некоторые ошибки, если вы не запустите его с -v
(или, возможно, perf --debug verbose=10
). Я запустил с -v
и получил реальную ошибку: Error: Failed to add events. Reason: Argument list too long (Code: -7)
. Я не думаю, что это была ошибка в вашем случае, но всегда запускайте команды perf
с -v
, если они не работают должным образом.
В моем случае ошибка «слишком длинный список аргументов» возникла из-за того, что я передавал очень длинное искаженное имя символа C++ в perf probe
; явное наименование контрольной точки с помощью синтаксиса EVENT=
позволило успешно добавить контрольную точку:
$ sudo perf probe -x myelf --no-demangle --add myalias=_SomeVeryLongMangledNameWhee
$ sudo perf record -e 'probe_myelf:myalias' -a -- sleep 30
Я не пробовал
perf probe
с JNI, но вместо этого могу предложить асинхронный профайлер. Он может легко отслеживать нативные функции, захватывая смешанную (нативную + Java) трассировку стека. Просто попробуйтеprofiler.sh -e Java_net_my_app_pollEvents0