2011-01-24 19 views

risposta

5

Su Linux è possibile utilizzare /usr/include/demangle.h che viene fornito con binutils-dev pacchetto. Dovrai collegarti allo libiberty da binutils.

+0

non c'è /usr/include/demangle.h sul mio linux ... – Walter

2

Attribuite compilatori diversi possono manipolare in modo diverso, ognuno tende a spedire con un costume C++ filt. Ma la maggior parte dei sistemi ha già una funzione di libreria demangling disponibile da qualche parte. Sulla mia macchina Linux ho trovato /usr/include/c++/version/cxxabi.h header che definisce __cxa_demangle() (vedi http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Pensavo di aver usato qualche altra funzione in passato, però, ma non riesco a trovare i dettagli (EDIT: probabilmente la versione demangle dei documenti di Ismail). Su AIX c'è un demangle.h.

EDIT: sulla maggior parte dei sistemi con programmi pstack e C++ FILT (ad esempio Linux e Solaris), il seguente dovrebbe funzionare ...

#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(); 
} 

... uscita ...

#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() 

noti che __read_nocancel ecc non sono C++ - identificatori straziati: sono i nomi delle funzioni C solo interni, utilizzando il riservato-per-implementazione leader-sottolineatura-e-maiuscolo lettere o convensions leader del doppio di sottolineatura.

X::f()era un identificatore maciullato e è stato demangled.

+0

che ne dici di solaris, il printtack non si limita a squarciare. dovrei stampare stack su pipe e leggere, demangle il msg? –

+0

@dma: codice di esempio sopra - testato sotto Linux ma dovrebbe funzionare su Solaris. Saluti. –

+0

Mi piace il collegamento libstdC++. Ma non posso in buona coscienza dare un +1 a qualcosa che sostiene l'uso di 'popen()' come questo. : P – asveikau

Problemi correlati