0

我尝试使用 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手册页的小例子,效果很好。

有谁知道为什么 name 列在这里的格式如此难看?

4

1 回答 1

1

'_ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_' 之类的名称来自 C++名称 mangling。命名空间、类名、模板参数、函数名、函数参数类型都记录在名称中。通过 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&)

或者最后 - 它是复制构造函数

unordered_map<String, String...>::unordered_map( unordered_map<String, String...> const&)
于 2016-11-09T01:15:36.730 回答