c++ c function assembly name-mangling

c++ - función para mangle/demangle funciones



function assembly (2)

Anteriormente, se me mostró que las funciones C ++ no se representan fácilmente en el ensamblaje. Ahora estoy interesado en leer de una manera u otra porque callgrind, parte de valgrind, los muestra demandados mientras que en el ensamblaje se muestran mutilados, por lo que me gustaría modificar la salida de la función valgrind o exigir los nombres de ensamblado de las funciones. ¿Alguien ha intentado algo así? Estaba mirando un sitio web y descubrí lo siguiente:

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

Alguien alguna vez ha intentado algo así, quiero demangle / mangle en C? mi compilador es gcc 4.x


Utilice la herramienta de línea de comandos c++filt para exigir el nombre.


Aquí está mi implementación de C ++ 11, derivada de la siguiente página: 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; }

Para facilitar la gestión de la memoria en el devuelto (char *), estoy usando un std :: shared_ptr con una función lambda ''deleter'' personalizada que llama a free () en la memoria devuelta. Debido a esto, no tengo que preocuparme de borrar la memoria por mi cuenta, solo la uso según sea necesario, y cuando el shared_ptr queda fuera del alcance, la memoria se liberará.

Esta es la macro que uso para acceder al nombre de tipo demandado como a (const char *). Tenga en cuenta que debe tener RTTI activado para tener acceso a ''typeid''

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

Entonces, desde dentro de una clase de C ++, puedo decir:

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