функция для манипулирования /деманглирования функций

Ранее мне здесь было показано, что функции C ++ нелегко представлены в сборе. Теперь я заинтересован в том, чтобы прочитать 1, так или иначе, потому что callgrind, часть valgrind, показывает их деформированными, в то время как в сборке они отображаются искаженными, поэтому я хотел бы либо манипулировать выходными данными функции valgrind, либо деманглировать имена функций. Кто-нибудь когда-нибудь пробовал что-то подобное? Я просматривал веб-сайт и обнаружил следующее:

 Code to implement demangling is part of the GNU Binutils package; 
see libiberty/cplus-dem.c and include/demangle.h.

кто-нибудь когда-нибудь пробовал что-то подобное, я хочу разобрать /калечить в C? мой компилятор gcc 4.x

10 голосов | спросил Syntax_Error 9 FebruaryEurope/MoscowbWed, 09 Feb 2011 02:16:07 +0300000000amWed, 09 Feb 2011 02:16:07 +030011 2011, 02:16:07

2 ответа


0

Используйте инструмент командной строки c++filt для разборки имени.

ответил Eugen Constantin Dinca 9 FebruaryEurope/MoscowbWed, 09 Feb 2011 02:21:31 +0300000000amWed, 09 Feb 2011 02:21:31 +030011 2011, 02:21:31
0

Вот моя реализация C ++ 11, полученная из следующей страницы: http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html

#include <cxxabi.h>  // needed for abi::__cxa_demangle

std::shared_ptr<char> cppDemangle(const char *abiName)
{
  int status;    
  char *ret = abi::__cxa_demangle(abiName, 0, 0, &status);  

  /* NOTE: must free() the returned char when done with it! */
  std::shared_ptr<char> retval;
  retval.reset( (char *)ret, [](char *mem) { if (mem) free((void*)mem); } );
  return retval;
}

Чтобы упростить управление памятью возвращаемых данных (char *), я использую std :: shared_ptr с пользовательской лямбда-функцией 'delete', которая вызывает free () для возвращенной памяти. Из-за этого мне не нужно беспокоиться об удалении памяти самостоятельно, я просто использую ее по мере необходимости, и когда shared_ptr выходит из области видимости, память освобождается.

Вот макрос, который я использую для доступа к имени demangled type как a (const char *). Обратите внимание, что у вас должен быть включен RTTI, чтобы иметь доступ к 'typeid'

#define CLASS_NAME(somePointer) ((const char *) cppDemangle(typeid(*somePointer).name()).get() )

Итак, из класса C ++ я могу сказать:

printf("I am inside of a %s\n",CLASS_NAME(this));
ответил Dave 7 AM00000040000004331 2014, 04:13:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132