无法为 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
需要从文件偏移,objdump
和readelf
在调整加载地址后返回地址。对于-pie
可执行文件,加载地址为0,地址将相同。
对于非-pie
可执行文件,您可以通过查看readelf -l /path/file
的输出并搜索偏移量0x000000
并查看VirtAddr
它指向的内容来获取加载地址,然后从您的符号地址中减去该数字从objdump --syms
或readelf --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++ 方法添加性能探针的主要内容,如果未能解决你的问题,请参考以下文章