2011-01-24 13 views

Respuesta

5

En Linux puede usar /usr/include/demangle.h que viene con el paquete binutils-dev. Tendrá que enlazar al libiberty desde binutils.

+0

no hay /usr/include/demangle.h en mi linux ... – Walter

2

Dadas las diferentes compiladores pueden destrozar de manera diferente, cada uno tiende a buque con un C++ filt personalizado. Pero, la mayoría de los sistemas ya tendrán disponible una función de biblioteca exigente en alguna parte. En mi cuadro de Linux, encontré el encabezado /usr/include/c++/version/cxxabi.h definiendo __cxa_demangle() (vea http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Aunque pensé que había usado alguna otra función en el pasado, pero no puedo encontrar los detalles (EDIT: probablemente la versión demangle de documentos de correo electrónico). En AIX hay un demangle.h.

EDIT: en la mayoría de los sistemas con programas pstack y C++ filt (es decir, Linux y Solaris), el siguiente debería funcionar ...

#include <cstdio> 
#include <iostream> 
#include <sstream> 

struct X 
{ 
    void f() 
    { 
     std::ostringstream cmd; 
     cmd << "pstack " << getpid() << " | c++filt"; 
     if (FILE* f = popen(cmd.str().c_str(), "r")) 
     { 
      char buffer[1024]; 
      int n; 
      while ((n = fread(buffer, 1, sizeof buffer, f)) > 0) 
       std::cout.write(buffer, n); 
     } 
     else 
      std::cerr << "popen() failed\n"; 
    } 
}; 

int main() 
{ 
    X x; 
    x.f(); 
} 

... ... de salida

#0 0x003539be in __read_nocancel() from /lib/tls/i686/libc.so.6 
#1 0x002ff590 in _IO_file_read_internal() from /lib/tls/i686/libc.so.6 
#2 0x002fe522 in _IO_new_file_underflow() from /lib/tls/i686/libc.so.6 
#3 0x00300371 in __underflow() from /lib/tls/i686/libc.so.6 
#4 0x0030079d in _IO_default_xsgetn_internal() from /lib/tls/i686/libc.so.6 
#5 0x00300733 in _IO_sgetn_internal() from /lib/tls/i686/libc.so.6 
#6 0x002f666c in fread() from /lib/tls/i686/libc.so.6 
#7 0x08048c36 in X::f() 
#8 0x08048ac0 in main() 

Observe que __read_nocancel etc NO son identificadores C++ - mutilados: son solo nombres de funciones internas de C, utilizando las convensiones de guion bajo subrayado y mayúscula reservado o guión doble principal.

X::f()era un identificador mutilado y ha sido recompuestos.

+0

¿qué hay de los solaris, la toma de fotos simplemente no exige. ¿Debo imprimir la pila en una tubería y leer, exigir el mensaje? –

+0

@dma: Código de ejemplo anterior: probado en Linux, pero debería funcionar en Solaris. Aclamaciones. –

+0

Me gusta el enlace libstdC++. Pero no puedo, con buena conciencia, dar un +1 a algo que defiende el uso de 'popen()' como este. : P – asveikau

Cuestiones relacionadas