【发布时间】:2016-03-18 00:06:53
【问题描述】:
在看到来自 CppCon 2015 的 this 演讲后,我想试一试性能来分析一些程序。我下载了该人在演讲中使用的同一个 Google 基准测试库,使用适当的开关编译了我的程序,并将其链接到它,然后使用 perf 记录运行。报告选项给了我这个:
如您所见,函数名称不是很易读。我认为这与 C++ 名称修改有关。有趣的是,所有的函数名称都正确地显示在了演讲者的视频中,但对我来说却不是。我不认为这是完全丢失符号信息的情况,因为在这种情况下我只会看到内存地址。出于某种原因,perf 无法为我“撤消” C++ 名称重整,这令人沮丧。
我使用的是 gcc (g++) 版本 5.2.1,perf 是版本 4.2.6,我在编译时使用了这些开关:
-I<my own include path> -L<path to the benchmark library> -O3 -std=c++14 -gdwarf-2 -fno-rtti -Wall -pedantic -lbenchmark -pthread
我不使用-fno-omit-frame-pointer 的原因是我改用-gdwarf-2 选项,它将调试信息保留在dwarf 可执行文件中,这是在这种情况下保留帧指针的替代方法。这也意味着我将--call-graph "dwarf" 传递给perf record。反正我也试过帧指针的方法,结果一样,没关系。
那么在这种情况下,为什么不执行“撤消”C++ 名称修改呢?这和使用GCC有什么关系,当然是说我使用的是libstdc++?
【问题讨论】:
-
我使用的是 Arch Linux,
perf report显示正确的符号去管理。 perf 的手册页还显示有一个默认启用的--demangle选项。由于我没有看到与您相同的行为,因此我没有答案,但您看到的不是预期的默认行为。 -
我也尝试手动添加该开关,但没有任何改变
-
@GabrielSouthern 你也在使用 gcc 吗?
-
gcc --version gcc (GCC) 5.2.0
-
看来您使用的是 Ubuntu。我怀疑这是您的问题和解决方案:stackoverflow.com/a/34061874/2166274
标签: c++ profiling perf name-mangling