
Biblioteca C multiarquitetura para desempilhamento de pilha, geração de backtrace e tratamento de exceções, usada para depuração, criação de perfil e análise binária no Linux, FreeBSD e HP-UX.
-- 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 testada e suportada. Linux/PARISC: Funciona bem, mas a biblioteca C não possui unwind-info. HP-UX/IA-64: Funciona na maioria dos casos, mas sabe-se que tem algumas limitações sérias. Linux/AArch64: Adicionada recentemente. Linux/PPC64: Adicionada recentemente. Linux/SuperH: Adicionada recentemente. FreeBSD/i386: Adicionada recentemente. FreeBSD/x86-64: Adicionada recentemente (a arquitetura FreeBSD é conhecida como amd64).
Em geral, esta biblioteca pode ser compilada e instalada com os seguintes comandos:
$ autoreconf -i # Needed only for building from git. Depends on libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
onde PREFIX é o prefixo de instalação. Por padrão, um prefixo de /usr/local é usado, de modo que libunwind.a é instalado em /usr/local/lib e unwind.h é instalado em /usr/local/include. Para teste, você pode querer usar um prefixo de /usr/local em vez disso.
** 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 unwind 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 power suportar registradores altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Para verificar se o seu processador tem suporte para registradores vetoriais (altivec): cat /proc/cpuinfo | grep altivec e deve ter algo assim: cpu : PPC970, altivec supported
Se libunwind parecer não funcionar (backtracing falhando), tente compilá-lo com -O0, sem otimizações. Existem alguns problemas do 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 em 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 com 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 Linux IA-64
A menos que você tenha uma biblioteca C e compilador muito recentes instalados, atualmente é esperado que os seguintes testes falhem no Linux IA-64:
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 antigos, significa apenas que para certos casos extremos, o unwind falhará. Como são casos extremos, não é provável que aplicações os acionem.
Nota: Se você obtiver muitos erros em Gia64-test-nat e Lia64-test-nat, é quase certo um sinal de um montador antigo. O montador GNU costumava codificar incorretamente os deslocamentos relativos ao ponteiro de pilha anterior. Este bug foi corrigido em 21-Set-2004, então qualquer montador posterior estará correto.
** Resultados esperados no Linux x86
Os seguintes testes devem falhar no Linux x86:
Gtest-resume-sig (falha ao obter SIGUSR2)
Ltest-resume-sig (igualmente)
Gtest-dyn1 (sem suporte a informações de unwind dinâmico ainda)
Ltest-dyn1 (igualmente)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (sem _Ux86_getcontext ainda)
test-ptrace
** Resultados esperados no Linux x86-64
Os seguintes testes devem falhar no Linux x86-64:
Gtest-dyn1 (sem suporte a informações de unwind dinâmico ainda)
Ltest-dyn1 (igualmente)
Gtest-init (veja http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (igualmente)
test-async-sig (falha devido a informações de unwind ruins?)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (sem _Ux86_64_getcontext ainda)
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 Linux PARISC
Aviso: GCC v3.4 ou mais recente é necessário no Linux PA-RISC. Versões anteriores do compilador não conseguiam gerar o cabeçalho do programa de tratamento de exceções (GNU_EH_FRAME) necessário para o unwind.
Os seguintes testes devem falhar no Linux x86-64:
Gtest-bt (backtrace truncado em kill() devido à falta de unwind-info)
Ltest-bt (igualmente)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() está errado de alguma forma)
Ltest-resume-sig (igualmente)
Gtest-init (igualmente)
Ltest-init (igualmente)
Gtest-dyn1 (sem suporte a informações de unwind dinâmico ainda)
Ltest-dyn1 (sem suporte a informações de unwind dinâmico ainda)
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 para HP-UX. Você pode tentar executá-lo, mas a maioria dos testes falhará (e alguns podem falhar ao terminar). Os únicos programas de teste que se sabe que funcionam 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 Linux PPC64
"make check" deve executar com no máximo 10 dos 24 testes com falha.
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 esses testes com os seguintes comandos:
$ cd tests $ make perf
Por favor, dirija todas as perguntas sobre esta biblioteca para:
Você pode fazer isso enviando um e-mail para [email protected] com um corpo de:
subscribe libunwind-devel
ou você pode se inscrever e gerenciar sua inscrição através da interface web em:
https://savannah.nongnu.org/mail/?group=libunwind