sprof flat profile name列具有难看的格式

时间:2016-07-07 17:35:14

标签: c++ shared-libraries profiling name-mangling sprof

我尝试使用sprof来分析共享库提供的功能。 分析工作,但包含函数名称的列格式非常难看。我正在使用例如boost提供的unordered_map。平面轮廓中的相关条目是:

Each sample counts as 0.01 seconds.
%   cumulative   self              self     total
time   seconds   seconds    calls  us/call  us/call  name
[...]
0.12     78.47     0.10   232327     0.43            _ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_
[...]

我使用了sprof手册页中描述的相同命令。我只是改变了路径。 整个配置文件很难阅读,因为人们无法清楚地看到命名空间,类名,函数名等等。

我尝试了sprof手册页的小例子,效果很好。

有谁知道为什么名称列在这里如此难以格式化?

1 个答案:

答案 0 :(得分:1)

名称如'_ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_' 来自C ++ name mangling。名称空间,类名,模板参数,函数名,函数参数类型都记录在名称中。通过修改,C ++还有一些其他功能,例如用于不同参数的重载方法和用于生成特定于类型的代码的模板。

您可以使用c++filt程序过滤输出,该程序将大多数C ++符号名称解析为类似C ++代码的格式,可由人类阅读。

还有解码名称的在线服务:https://demangler.com/ 它将你的符号解构为:

boost::unordered::unordered_map<BALL::String, BALL::String, boost::hash<BALL::String>, std::equal_to<BALL::String>, std::allocator<std::pair<BALL::String const, BALL::String> > >::unordered_map(boost::unordered::unordered_map<BALL::String, BALL::String, boost::hash<BALL::String>, std::equal_to<BALL::String>, std::allocator<std::pair<BALL::String const, BALL::String> > > const&)

或者,如果我们改写它:

boost::unordered_map<BALL::String, BALL::String...>::
 unordered_map(boost::unordered::unordered_map<BALL::String, BALL::String...> const&)

或最后 - 它是copy constructor

unordered_map<String, String...>::unordered_map( unordered_map<String, String...> const&)