无法为 C++ 方法添加性能探针

Posted

技术标签:

【中文标题】无法为 C++ 方法添加性能探针【英文标题】:Can't add perf probe for C++ methods 【发布时间】:2013-11-24 08:05:51 【问题描述】:

我正在尝试在我的库中为 C++ 方法添加 perf probe,但我不断收到以下信息:

$ perf probe --exec=/path/to/file --add='my::Own::Method'
Semantic error :There is non-digit char in line number.

我列出了可用的功能,如下所示:

$ perf probe --funcs --exec=/path/to/file

并尝试了一些也包含的 C 函数。可以为这些添加探针。所以我尝试了错误的名称(例如_ZN2my8Own16Method),perf probe 说它不存在。

有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

作为一种解决方法,您可以使用objdump 获取方法地址,perf probe 将接受它。

  $ perf probe -x /path/file '0x643f30'
Added new event:
  probe_libfile:abs_643f30 (on 0x643f30 in /path/file)

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

    perf record -e probe_libfile:abs_643f30 -aR sleep 1

请注意perf probe 需要从文件偏移,objdumpreadelf 在调整加载地址后返回地址。对于-pie 可执行文件,加载地址为0,地址将相同。 对于非-pie 可执行文件,您可以通过查看readelf -l /path/file 的输出并搜索偏移量0x000000 并查看VirtAddr 它指向的内容来获取加载地址,然后从您的符号地址中减去该数字从objdump --symsreadelf --syms 获取。通常是0x400000

【讨论】:

objdump ./<executable> --syms | grep -i <method> 为我工作。输出中的第一列是要传递给perf probe 的地址。但必须在地址前加上“0x”,否则 perf 命令将失败。【参考方案2】:

您可以运行它来查看所有 C++ 错位形式的函数名称:

perf probe --exec=/path/to/file --funcs --no-demangle --filter='*'

找到您想要的(实际的函数名称将在损坏的标记中),并使用--no-demangle 选项添加它。

【讨论】:

以上是关于无法为 C++ 方法添加性能探针的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 将项目添加到排序数组的最快方法

添加用户定义类型 C++

将 `__str__` 方法添加到 Boost Python C++ 类时的构建问题

C++ 风格:为覆盖方法添加前缀 virtual 关键字

在 C++ 中使用 Dtrace 设置我自己的探针

3 步排查,3 步优化,探针性能损耗直降 44%