2011-02-08 19 views
7

我以前已经显示,here,显示C++函数不容易在汇编中表示。现在我有兴趣阅读一种或另一种方式,因为valgrind的一部分,callgrind在汇编时显示它们已被取消处理,因此我想要修改valgrind函数输出或取消函数的程序集名称。任何人曾经尝试过这样的事情?我一直在寻找在website,发现了以下工作:函数去破碎/ demangle函数

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

没有人试过这样的事情,我想在C还原函数/撕裂?我的编译器是gcc 4.x

+3

我不明白你的问题 - 你已经发布你自己的答案,使用binutils的代码。其他工具链也有类似的库/代码片段,所以问题在哪里? – 2011-02-08 23:22:03

+3

IIRC然后valgrind已经有一个--demangle = yes选项来在输出上去除C++符号。 Callgrind可以称为`valgrind --tool = callgrind --demangle = yes`那么,不可以吗? – 2011-02-08 23:28:27

+0

@路德:我打开了另一个论坛来检查是否demangle vallgrind http://stackoverflow.com/questions/4846411/de-mangeling-in-callgrind但没有人回答。我看着linux手册来取消它的提供没有任何东西!你的建议奏效了。 thngs – 2011-02-09 00:47:03

回答

13

使用c++filt命令行工具来取消名称的缩减。

11

这里是我的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));