哪里是c ++ filt源代码?

时间:2011-01-24 08:09:30

标签: c++

有谁知道c ++ filt源代码的链接。我想在我的代码中调用c ++ filt作为库。

3 个答案:

答案 0 :(得分:6)

它是binutils的一部分:

http://ftp.gnu.org/gnu/binutils/

答案 1 :(得分:6)

在Linux上,您可以使用/usr/include/demangle.h包附带的binutils-dev。您必须从libiberty链接到binutils

答案 2 :(得分:4)

鉴于不同的编译器可以不同地编译,每个编译器都倾向于使用自定义c ++ filt。但是,大多数系统已经在某处可以使用demangling库函数。在我的Linux机器上,我找到了定义__cxa_demangle()的/usr/include/c++/version/cxxabi.h标头(参见http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html)。我以为我过去曾使用过其他功能,但找不到详细信息(编辑:可能是demangle版本的İsmail文件)。在AIX上有一个demangle.h。

编辑:在大多数使用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() 是一个错位的标识符,而 已被解除标记。