问题 哪里是c ++ filt源代码?


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


8644
2018-01-24 08:09


起源



答案:


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


6
2018-01-24 08:27



我的linux上没有/usr/include/demangle.h ... - Walter


答案:


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


6
2018-01-24 08:27



我的linux上没有/usr/include/demangle.h ... - Walter


它是binutils的一部分:

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


5
2018-01-24 08:14





鉴于不同的编译器可以不同地编译,每个编译器都倾向于使用自定义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()   一个错位的标识符和 具有 被扼杀了。


3
2018-01-24 08:24



怎么样solaris,printstack只是没有demangle。我应该将堆栈打印到管道,然后阅读,解压缩消息? - Da Ma
@dma:上面的示例代码 - 在Linux下测试但应该在Solaris上运行。干杯。 - Tony Delroy
我喜欢libstdc ++链接。但我不能凭良心给予主张使用的东西+1 popen() 喜欢这个。 :P - asveikau
@asveikau:我实际上并没有提倡它 - 只是说明如何做@dma在上面的评论中所提出的问题。那就是说,我会提倡它吗?我无动于衷。这种堆栈打印通常是故意处理失败的断言或灾难性错误的近乎最后一步:没有特别需要内化代码:如果popen()/ sh等额外的内存开销停止它工作,所以它;如果它更慢,谁在乎 - 它曾经是蓝月亮的东西。和 pstack | c++filt 对于任何给定的操作系统来说,它都更具可移 - Tony Delroy
@dma:每个C ++编译器必须包含一些ABI标准,但它们可能在不同的操作系统上使用不同的标准。没有单一的行业范围的“C ++ ABI”,甚至没有单一的名称修改标准。这就是为什么你经常需要使用编译代码的同一编译器提供的c ++ filt或库函数。我不是这方面的专家:更多细节,你可以在一个新问题中把它放到更广泛的SO社区。干杯。 - Tony Delroy