St.*_*rio 5 java linux jvm perf
我正在尝试学习如何在运行一些用 C 编写的基于 JNI 的共享库的 java 应用程序上使用 perf 动态跟踪。该库通过路径安装/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.
Run Code Online (Sandbox Code Playgroud)
没有任何关于错误原因的提示。如果库中不存在具有此类名称的全局函数,我将得到相应的错误描述:
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.
Run Code Online (Sandbox Code Playgroud)
任何人都可以提示如何解决这个问题吗?我尝试添加一个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
Run Code Online (Sandbox Code Playgroud)
就我而言,“参数列表太长”错误是因为我将一个非常长的损坏的 C++ 符号名称传递给perf probe; 使用以下语法显式命名探测点EVENT=允许成功添加探测点:
$ sudo perf probe -x myelf --no-demangle --add myalias=_SomeVeryLongMangledNameWhee
$ sudo perf record -e 'probe_myelf:myalias' -a -- sleep 30
Run Code Online (Sandbox Code Playgroud)