功能到mangle/demangle函数

Syn*_*ror 11 c c++ assembly function name-mangling

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

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

有人曾尝试过类似的东西,我想在C中进行demangle/mangle吗?我的编译器是gcc 4.x.

Eug*_*nca 19

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

  • 是的,这适用于命令行.我相信提问者正在寻找可以在代码中调用的库函数. (2认同)
  • 一切都很好,事实上,当我阅读您的答案时,我学到了一些新知识,因此我当然很感激。我无论如何都在下面添加了“ from code”版本,因为这是我根据问题标题寻找的内容。我敢肯定,这两个答案都会对某人有所帮助。:) (2认同)

Dav*_*ave 15

这是我的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;
}
Run Code Online (Sandbox Code Playgroud)

为了使返回的(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() )
Run Code Online (Sandbox Code Playgroud)

所以,从C++类中我可以说:

printf("I am inside of a %s\n",CLASS_NAME(this));
Run Code Online (Sandbox Code Playgroud)

  • 不错。可以让它成为`unique_ptr`,或者直接构造一个`std::string` 和free()。 (3认同)
  • 谢谢谢。:) 我得看看 unique_ptr (还没有使用它们)。我故意没有使用 std::string/immediate free() 方法以避免额外的副本。也就是说,性能影响可能并不重要——我通常只将它用于调试打印,而不是任何类型的速度关键应用程序。无论如何,希望有足够的人可以根据自己的需要自定义功能。 (2认同)
  • 谢谢戴夫。我只是想指出,如果 boost 可用,则通过 `boost/core/demangle.hpp` 有一个更干净的选项,如下所示:/sf/answers/2444179671/ (2认同)