我所做的是:
\n\n1. sudo rm -rf /root/.debug/\n2. compile program with -g -O2 -fno-omit-frame-pointer\n3. run the program and get the pid\n4. sudo perf record -F 2000 -a -s -g -p $pid sleep 15\n5. sudo perf report\nRun Code Online (Sandbox Code Playgroud)\n\n然后我得到一小部分“未知”,就像
\n\n- 2.50% 0.00% postgres [unknown] [k] 0000000000000000 \n - 0 \n 1.12% _int_malloc \xe2\x96\x92\n 0.79% _IO_vsnprintf\nRun Code Online (Sandbox Code Playgroud)\n\n看起来这是由于 libc \'malloc\' 调用造成的。然后我在同一台机器上编写一个程序来测试它。
\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <sys/types.h>\n\nint main(int argc, char *argv[])\n{\n while(1) {\n printf("perf record -g -p %d -- sleep 5; perf report\\n", getpid());\n sleep(1);\n void *p = malloc(10);\n memset(p, 0, 10);\n free(p);\n }\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我做了与上面相同的事情,没有“未知”部分。
\n\n如何解释/解决这个问题?
\n[unknown]输出中的块引用动态共享对象 ( DSOperf report )的名称。无法解析DSO路径,因此打印. 根据最新的内核源代码树(撰写本文时为 5.3.9),您可以在此处查看。perf report[unknown]
重要的是要知道 DSO 符号的确定是在采样事件地址的帮助下进行的。函数thread__resolve正是负责执行此操作。在较旧的内核中,该thread__resolve方法有另一个名称 - perf_event__preprocess_sample_addr。
根据输出的快照,看起来在 , 期间采样的事件的地址perf record是 0。这意味着根本无法解析该地址。它是内核空间中的一个地址(查看符号[k] 0000000000000000)perf,在您的情况下,无法解析它。
注释突出显示设置perf_event_paranoid为合适的值,以便您可以成功探测内核和用户空间事件。设置perf_event_paranoid为允许您正确探测内核空间中的事件的值应该是正确解析地址的“一步”。