功能到mangle / demangle函数

时间:2011-02-08 23:16:07

标签: c++ c function assembly name-mangling

我之前已经证明here已经证明C ++函数不容易在汇编中表示。现在我有兴趣阅读这种或那种方式,因为callgrind,valgrind的一部分,显示它们已经解组,而在汇编时它们被显示为损坏,所以我想要破坏valgrind函数输出或者取消函数的汇编名称。有没有尝试过类似的东西?我正在查看website,并发现以下内容:

 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 个答案:

答案 0 :(得分:17)

使用c++filt命令行工具对名称进行解码。

答案 1 :(得分:14)

这是我的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&#39;删除&#39;在返回的内存上调用free()的函数。因此,我不必担心自己删除内存,我只是根据需要使用它,当shared_ptr超出范围时,内存将是免费的。

这里是我用来访问demangled类型名称的宏(const char *)。请注意,您必须启用RTTI才能访问&#39; typeid&#39;

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

所以,从C ++课程中我可以说:

printf("I am inside of a %s\n",CLASS_NAME(this));

答案 2 :(得分:0)

与上面的Dave版本略有不同。这是一个unique_ptr版本,它对返回类型进行了一些检查,尽管看起来您可以忽略它,但是以某种方式看起来并不干净。

auto cppDemangle (const char *abiName)
{
    //
    // This function allocates and returns storage in ret
    //
    int status;
    char *ret = abi::__cxa_demangle(abiName, 0 /* output buffer */, 0 /* length */, &status);

    auto deallocator = ( [](char *mem) { if (mem) free((void*)mem); } );

    if (status) {
        // 0: The demangling operation succeeded.
        // -1: A memory allocation failure occurred.
        // -2: mangled_name is not a valid name under the C++ ABI mangling rules.
        // -3: One of the arguments is invalid.
        std::unique_ptr<char, decltype(deallocator) > retval(nullptr, deallocator);
    }

    //
    // Create a unique pointer to take ownership of the returned string so it
    // is freed when that pointers goes out of scope
    //
    std::unique_ptr<char, decltype(deallocator) > retval(ret, deallocator);
    return retval;
}