2016-07-07 8 views
0

Я пытаюсь профилировать функции, предоставляемые совместно используемой библиотекой, используя sprof. Профилирование работает, но столбец с именами функций очень уродливый. Я использую, например, unordered_map, обеспечиваемый boost. Связанная запись в плоском профиле:sprof flat name name column имеет уродливый формат

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

названия, как '_ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_' являются от C++ name mangling. Пространства имен, имена классов, аргументы шаблона, имя функции, типы аргументов функции записываются в имя. С mangling, есть некоторые дополнительные возможности C++ как метод перегрузки для разных аргументов и шаблонов для генерации кода типа.

Вы можете отфильтровать вывод с помощью программы c++filt, которая объединяет большинство имен символов C++ в формате кода на C++, который можно прочитать человеком.

Есть также интернет-услуги demangle имена: https://demangler.com/ Это demangles свой символ:

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&)