我之前已经证明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
答案 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;
}