2011-01-24 6 views

答えて

5

/usr/include/demangle.hには、binutils-devパッケージが付属しています。 binutilsからlibibertyにリンクする必要があります。

+0

私のlinuxに/usr/include/demangle.hはありません... – Walter

2

考えると異なるコンパイラは、それぞれが独自のC++ FILTに同梱する傾向がある、異なっマングルすることができます。しかし、ほとんどのシステムではすでにどこかで利用可能なデアンギャングライブラリ機能があります。私のLinuxのボックスでは、__cxa_demangle()を定義している/usr/include/c++/version/cxxabi.hヘッダが見つかりました(http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html参照)。私は過去にいくつかの他の機能を使っていたと思っていましたが、詳細を見つけることはできませんでした(編集:おそらくデマンバージョンİsmailのドキュメント)。 AIXにはdemangle.hがあります。

EDIT:pstackのとC++ FILTプログラムとほとんどのシステム(つまり、LinuxおよびSolaris)上で、次のように動作するはずです...

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

...出力...

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

__read_nocancelなどは、C++のコード化された識別子ではないことに注意してください。実装されているのは、実装のために予約されているアンダースコアと大文字または先行ダブルアンダースコアのコンビネーションを使用する内部のC関数名です。

X::f()マングルされた識別子であり、復号化されてきました。

+0

ソラリスについては、プリントスタックだけがデマングルしません。私はパイプにスタックを印刷し、msgを解読する必要がありますか? –

+0

@dma:上記のサンプルコード - Linuxでテストされていますが、Solarisで動作する必要があります。乾杯。 –

+0

私はlibstdC++リンクが好きです。しかし、私は良心的にこのように 'popen() 'を使うことを支持するものに+1を与えることはできません。 :P – asveikau

関連する問題