我想尝试使用perf来对一些程序进行性能分析,这是我在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
。无论如何,我也尝试了帧指针方法,结果相同,所以这并不重要。那么为什么perf在这种情况下不会“取消”C++名称修饰?这是否与使用GCC有关,这当然意味着我正在使用libstdc++?
perf report
显示正确的符号解助。perf的手册也显示了一个默认启用的--demangle
选项。既然我没有看到与您相同的行为,那么我就没有答案,但是您所看到的不是预期的默认行为。 - Gabriel Southern