有谁知道c ++ filt源代码的链接。我想在我的代码中调用c ++ filt作为库。
答案 0 :(得分:6)
它是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()
是一个错位的标识符,而 已被解除标记。