2011-01-24 36 views

cevap

5

Linux'ta binutils-dev paketiyle birlikte gelen /usr/include/demangle.h paketini kullanabilirsiniz. binutils'dan libiberty'a bağlanmanız gerekir.

+0

linux'umda /usr/include/demangle.h yok ... – Walter

2

Verilen farklı derleyiciler her özel bir C++ filt ile gemi eğilimi, farklı cendereye olabilir. Ancak, çoğu sistemde zaten bir yerde mevcut olan bir değiştirme kütüphanesi işlevi olacaktır. Linux kutumda __cxa_demangle() öğesini tanımlayan /usr/include/c++/version/cxxabi.h başlıklarını buldum (bkz. http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Yine de geçmişte başka bir işlev kullandım, ama ayrıntıları bulamadım (EDIT: muhtemelen İsmail belgelerinin demo versiyonu). AIX'de bir demangle.h var. pstack ve C++ filt programlarına (yani Linux ve Solaris) ile çoğu sistemde, aşağıdaki çalışması gerekir ...

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

... çıkış ...

#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() 
: DÜZENLEME

__read_nocancel vb. C++ - karışık tanımlayıcılar olduğuna dikkat edin: bunlar uygulama için ayrılan alt çizgi-ve-büyük harf-harf ya da öncü-çift-alt çizgi konvolüsyonları için rezerve edilmiş uygulama kullanılarak sadece dahili C işlev adlarıdır.

X::f()

hurda bir tanımlayıcı ve demangled edilmiştir oldu.

+0

solaris hakkında nasıl, printstack sadece diziliş yapmaz. Yığını bir boruya yazdırmalı ve okumalı mıyım, msg komutunu mu? –

+0

@dma: Yukarıdaki örnek kod - Linux altında test edildi, ancak Solaris üzerinde çalışmalı. Şerefe. –

+0

LibstdC++ bağlantısını seviyorum. Ama iyi bir vicdan azabı, bunu “popen()” yi kullanarak savunan bir şeye +1 veremem. : P – asveikau