18

之前,在这里,我已经证明 C++ 函数不容易在汇编中表示。现在我有兴趣以一种或另一种方式阅读它们,因为 Callgrind 是 Valgrind 的一部分,在组装时显示它们被破坏。

所以我想要么破坏 Valgrind 函数输出,要么破坏函数的程序集名称。有人尝试过这样的事情吗?我正在查看一个网站,发现以下内容:

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

有没有人尝试过这样的事情?我想在 C.

我的编译器是 gcc 4.x。

4

3 回答 3

23

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

于 2011-02-08T23:21:31.607 回答
21

这是我的 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 超出范围时,内存将被释放。

这是我用来以 (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));
于 2014-08-07T00:13:43.413 回答
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);
        return retval;
    }

    //
    // 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;
}
于 2020-06-02T20:32:42.393 回答