Столбец с именем профиля sprof flat имеет уродливый формат
Я пытаюсь профилировать функции, предоставляемые общей библиотекой, используя sprof. Профилирование работает, но столбец, содержащий имена функций, очень плохо отформатирован. Я использую, например, unordered_map, предоставленный boost. Соответствующая запись в плоском профиле:
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++. Пространства имен, имена классов, аргументы шаблона, имя функции, типы аргументов функции записываются в имени. В 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&)