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));