
Biblioteca para desenrolar pilhas de chamadas do processador, suportando múltiplas arquiteturas e sistemas operacionais, com instruções de compilação e testes de regressão.
-- mode: Outline --
Esta é a versão 1.0 da biblioteca unwind. Esta biblioteca suporta várias combinações de arquitetura/sistema operacional:
Linux/x86-64: Funciona bem. Linux/x86: Funciona bem. Linux/ARM: Funciona bem. Linux/IA-64: Totalmente testado e suportado. Linux/PARISC: Funciona bem, mas a biblioteca C não possui informações de unwind. HP-UX/IA-64: Funciona na maioria dos casos, mas tem algumas limitações sérias conhecidas. Linux/AArch64: Adicionado recentemente. Linux/PPC64: Adicionado recentemente. Linux/SuperH: Adicionado recentemente. FreeBSD/i386: Adicionado recentemente. FreeBSD/x86-64: Adicionado recentemente (a arquitetura FreeBSD é conhecida como amd64).
Em geral, esta biblioteca pode ser compilada e instalada com os seguintes comandos:
$ autoreconf -i # Necessário apenas para compilar a partir do git. Depende do libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
onde PREFIX é o prefixo de instalação. Por padrão, é usado um prefixo de /usr/local, de modo que libunwind.a é instalado em /usr/local/lib e unwind.h é instalado em /usr/local/include. Para testes, talvez você queira usar um prefixo de /usr/local.
** Versão 8 e posteriores
A partir da versão 8, o nome preferido para o compilador Intel IA-64 é "icc" (mesmo nome que no x86). Assim, a linha de configuração deve ser assim:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Por enquanto, libunwind deve ser compilado com GCC no HP-UX.
libunwind deve ser configurado e instalado no HP-UX assim:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Aviso: O desempilhamento de binários de 32 bits (ILP32) não é suportado no momento.
** Solução alternativa para versões antigas do GCC
GCC v3.0 e GCC v3.2 vêm com uma versão ruim de sys/types.h. A solução alternativa é executar os seguintes comandos antes de executar "configure":
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 ou posteriores foram corrigidos e não requerem esta solução alternativa.
Para compilar para power64 você deve usar:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Se o seu processador suporta registradores altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Para verificar se o seu processador suporta registradores vetoriais (altivec): cat /proc/cpuinfo | grep altivec e deve ter algo assim: cpu : PPC970, altivec supported
Se libunwind parece não funcionar (o backtrace falha), tente compilá-lo com -O0, sem otimizações. Existem alguns problemas com o compilador dependendo da versão do seu gcc.
As instruções gerais de compilação se aplicam. Para compilar e executar vários testes, você precisa da biblioteca libexecinfo disponível nos ports como devel/libexecinfo.
O desenvolvimento do port foi feito no FreeBSD 8.0-STABLE. A biblioteca foi compilada com o compilador do sistema que é uma versão modificada do gcc 4.2.1, bem como o gcc 4.4.3.
Após compilar a biblioteca, você pode executar um conjunto de testes de regressão com:
$ make check
** Resultados esperados no IA-64 Linux
A menos que você tenha uma biblioteca C e um compilador muito recentes, é esperado atualmente que os seguintes testes falhem no IA-64 Linux:
Gtest-init (deve passar a partir de glibc-2.3.x/gcc-3.4)
Ltest-init (deve passar a partir de glibc-2.3.x/gcc-3.4)
test-ptrace (deve passar a partir de glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (deve passar a partir de glibc-2.3.x)
Isso não significa que libunwind não possa ser usado com compiladores ou bibliotecas C mais antigas, apenas que, para certos casos específicos, o desempilhamento falhará. Como são casos específicos, é improvável que as aplicações os acionem.
Nota: Se você obtiver muitos erros em Gia64-test-nat e Lia64-test-nat, é quase certo que é um sinal de um montador antigo. O montador GNU costumava codificar offsets relativos ao ponteiro de pilha anterior incorretamente. Esse bug foi corrigido em 21-Set-2004, portanto, qualquer montador posterior estará correto.
** Resultados esperados no x86 Linux
Espera-se que os seguintes testes falhem no x86 Linux:
Gtest-resume-sig (falha ao obter SIGUSR2)
Ltest-resume-sig (da mesma forma)
Gtest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
Ltest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (_Ux86_getcontext ainda não implementado)
test-ptrace
** Resultados esperados no x86-64 Linux
Espera-se que os seguintes testes falhem no x86-64 Linux:
Gtest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
Ltest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
Gtest-init (veja http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (da mesma forma)
test-async-sig (crash devido a informações de unwind ruins?)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (_Ux86_64_getcontext ainda não implementado)
run-ptrace-mapper (??? investigar)
run-ptrace-misc (veja http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
e http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Resultados esperados no PARISC Linux
Aviso: GCC v3.4 ou mais recente é necessário no PA-RISC Linux. Versões mais antigas do compilador não conseguiam gerar o cabeçalho do programa de tratamento de exceções (GNU_EH_FRAME) necessário para desempilhamento.
Espera-se que os seguintes testes falhem no x86-64 Linux:
Gtest-bt (backtrace truncado em kill() devido à falta de informações de unwind)
Ltest-bt (da mesma forma)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() está errado de alguma forma)
Ltest-resume-sig (da mesma forma)
Gtest-init (da mesma forma)
Ltest-init (da mesma forma)
Gtest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
Ltest-dyn1 (suporte a informações de unwind dinâmico ainda não implementado)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (toolchain não suporta HIDDEN ainda)
** Resultados esperados no HP-UX
"make check" atualmente não é suportado no HP-UX. Você pode tentar executá-lo, mas a maioria dos testes falhará (e alguns podem não terminar). Os únicos programas de teste que se sabe funcionarem neste momento são:
tests/bt
tests/Gperf-simple
tests/test-proc-info
tests/test-static-link
tests/Gtest-init
tests/Ltest-init
tests/Gtest-resume-sig
tests/Ltest-resume-sig
** Resultados esperados no PPC64 Linux
"make check" deve executar com no máximo 10 de 24 testes falhando.
Esta distribuição inclui alguns testes de desempenho simples que dão uma ideia do custo básico de várias operações do libunwind. Após compilar a biblioteca, você pode executar estes testes com os seguintes comandos:
$ cd tests $ make perf
Por favor, direcione todas as perguntas sobre esta biblioteca para:
Você pode fazer isso enviando um e-mail para [email protected] com o corpo:
subscribe libunwind-devel
ou você pode se inscrever e gerenciar sua inscrição via interface web em:
https://savannah.nongnu.org/mail/?group=libunwind