这里是我的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与自定义的lambda'deleter'函数调用返回的内存上的free()。因此,我永远不必担心自己删除内存,我只是根据需要使用它,而当shared_ptr超出范围时,内存将被释放。
下面是我用来访问demangled类型名称的宏(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));
我不明白你的问题 - 你已经发布你自己的答案,使用binutils的代码。其他工具链也有类似的库/代码片段,所以问题在哪里? – 2011-02-08 23:22:03
IIRC然后valgrind已经有一个--demangle = yes选项来在输出上去除C++符号。 Callgrind可以称为`valgrind --tool = callgrind --demangle = yes`那么,不可以吗? – 2011-02-08 23:28:27
@路德:我打开了另一个论坛来检查是否demangle vallgrind http://stackoverflow.com/questions/4846411/de-mangeling-in-callgrind但没有人回答。我看着linux手册来取消它的提供没有任何东西!你的建议奏效了。 thngs – 2011-02-09 00:47:03