Кто-нибудь знает ссылку исходного кода С++. Я хочу, чтобы в моем коде была включена функция С++ С++ в качестве библиотеки.
Где С++ исходный код фильтра?
Ответ 1
В Linux вы можете использовать /usr/include/demangle.h
, который поставляется с пакетом binutils-dev
. Вам нужно будет привязать к libiberty
от binutils
.
Ответ 2
это часть binutils:
Ответ 3
Учитывая, что разные компиляторы могут калечить по-разному, каждый имеет тенденцию поставляться с пользовательским фильтром С++. Но в большинстве систем уже есть доступная функция библиотеки demangling. В моем ящике Linux я нашел заголовок /usr/include/c ++/version/cxxabi.h, определяющий __cxa_demangle() (см. http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Я думал, что раньше использовал какую-то другую функцию, но не могу найти детали (EDIT: возможно, версия demangle İsmail). В AIX есть demangle.h.
EDIT: в большинстве систем с программами pstack и С++ (например, 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, используя зарезервированные для -предупреждения: подчеркивание-верхний и верхний регистр или перекрестные ссылки с двойным подчеркиванием.
X::f()
был искаженным идентификатором и был изменен.