perf 动态追踪 添加事件失败

Perf dynamic tracing Failed to add events

我正在尝试学习如何在我的 java 应用程序 运行 上使用 perf 动态跟踪以及一些用 C 编写的基于 JNI 的共享库。该库通过路径 [=13] 安装=] 然后是 运行 和选项 -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

在我的例子中,“参数列表太长”错误是因为我将一个很长的损坏的 C++ 符号名称传递给 perf probe;使用 EVENT= 语法显式命名探测点允许成功添加探测点:

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