
Bibliothèque multi-architecture pour le déroulement des piles d'appels de programme, permettant le débogage de bas niveau, l'analyse des crashs et la recherche en sécurité sur les systèmes Linux, FreeBSD et HP-UX.
-- mode: Outline --
Ceci est la version 1.0 de la bibliothèque unwind. Cette bibliothèque prend en charge plusieurs combinaisons architecture/système d'exploitation :
Linux/x86-64 : Fonctionne bien. Linux/x86 : Fonctionne bien. Linux/ARM : Fonctionne bien. Linux/IA-64 : Entièrement testé et pris en charge. Linux/PARISC : Fonctionne bien, mais la bibliothèque C manque d'informations de déroulement (unwind-info). HP-UX/IA-64 : Fonctionne en grande partie mais présente des limitations sérieuses connues. Linux/AArch64 : Récemment ajouté. Linux/PPC64 : Récemment ajouté. Linux/SuperH : Récemment ajouté. FreeBSD/i386 : Récemment ajouté. FreeBSD/x86-64 : Récemment ajouté (l'architecture FreeBSD est connue sous le nom d'amd64).
En général, cette bibliothèque peut être construite et installée avec les commandes suivantes :
$ autoreconf -i # Nécessaire uniquement pour une construction à partir de git. Dépend de libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
où PREFIX est le préfixe d'installation. Par défaut, un préfixe de /usr/local est utilisé, de sorte que libunwind.a soit installé dans /usr/local/lib et unwind.h dans /usr/local/include. Pour les tests, vous pouvez utiliser un préfixe de /usr/local.
** Version 8 et ultérieures
À partir de la version 8, le nom préféré pour le compilateur Intel IA-64 est "icc" (même nom que sur x86). Ainsi, la ligne de configure devrait ressembler à ceci :
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Pour le moment, libunwind doit être construit avec GCC sur HP-UX.
libunwind doit être configuré et installé sur HP-UX comme ceci :
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Avertissement : Le déroulement des binaires 32 bits (ILP32) n'est pas pris en charge pour le moment.
** Contournement pour les anciennes versions de GCC
GCC v3.0 et GCC v3.2 sont livrés avec une mauvaise version de sys/types.h. La solution de contournement consiste à exécuter les commandes suivantes avant d'exécuter "configure" :
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 ou ultérieur a été corrigé et ne nécessite pas ce contournement.
Pour construire pour power64, vous devez utiliser :
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Si votre processeur prend en charge les registres altivec : $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Pour vérifier si votre processeur prend en charge les registres vectoriels (altivec) : cat /proc/cpuinfo | grep altivec et vous devriez voir quelque chose comme ceci : cpu : PPC970, altivec supported
Si libunwind semble ne pas fonctionner (le backtrace échoue), essayez de le compiler avec -O0, sans optimisations. Il existe certains problèmes de compilateur selon la version de votre gcc.
Les instructions générales de construction s'appliquent. Pour construire et exécuter plusieurs tests, vous avez besoin de la bibliothèque libexecinfo disponible dans les ports sous le nom devel/libexecinfo.
Le développement du port a été effectué sur FreeBSD 8.0-STABLE. La bibliothèque a été construite avec le compilateur système, qui est une version modifiée de gcc 4.2.1, ainsi qu'avec gcc 4.4.3.
Après avoir construit la bibliothèque, vous pouvez exécuter un ensemble de tests de régression avec :
$ make check
** Résultats attendus sur IA-64 Linux
Sauf si vous disposez d'une bibliothèque C et d'un compilateur très récents, il est actuellement attendu que les tests suivants échouent sur IA-64 Linux :
Gtest-init (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
Ltest-init (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
test-ptrace (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (devrait réussir à partir de glibc-2.3.x)
Cela ne signifie pas que libunwind ne peut pas être utilisé avec des compilateurs ou bibliothèques C plus anciens, seulement que dans certains cas particuliers, le déroulement échouera. Comme ce sont des cas particuliers, il est peu probable que les applications les déclenchent.
Remarque : Si vous obtenez beaucoup d'erreurs dans Gia64-test-nat et Lia64-test-nat, il s'agit presque certainement d'un signe d'un assembleur ancien. L'assembleur GNU avait l'habitude d'encoder incorrectement les décalages relatifs au pointeur de pile précédent. Ce bogue a été corrigé le 21-Sep-2004, donc tout assembleur ultérieur fonctionnera correctement.
** Résultats attendus sur x86 Linux
Les tests suivants devraient échouer sur x86 Linux :
Gtest-resume-sig (ne parvient pas à obtenir SIGUSR2)
Ltest-resume-sig (de même)
Gtest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
Ltest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (pas encore de _Ux86_getcontext)
test-ptrace
** Résultats attendus sur x86-64 Linux
Les tests suivants devraient échouer sur x86-64 Linux :
Gtest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
Ltest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
Gtest-init (voir http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (de même)
test-async-sig (plante à cause de mauvaises informations de déroulement ?)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (pas encore de _Ux86_64_getcontext)
run-ptrace-mapper (??? à investiguer)
run-ptrace-misc (voir http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
et http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Résultats attendus sur PARISC Linux
Avertissement : GCC v3.4 ou plus récent est nécessaire sur PA-RISC Linux. Les versions antérieures du compilateur ne parvenaient pas à générer l'en-tête de programme de gestion des exceptions (GNU_EH_FRAME) nécessaire au déroulement.
Les tests suivants devraient échouer sur x86-64 Linux :
Gtest-bt (backtrace tronqué au niveau de kill() en raison du manque d'informations de déroulement)
Ltest-bt (de même)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() est incorrect d'une certaine manière)
Ltest-resume-sig (de même)
Gtest-init (de même)
Ltest-init (de même)
Gtest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
Ltest-dyn1 (pas encore de prise en charge des informations de déroulement dynamique)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (la chaîne d'outils ne prend pas encore en charge HIDDEN)
** Résultats attendus sur HP-UX
"make check" n'est actuellement pas pris en charge pour HP-UX. Vous pouvez essayer de l'exécuter, mais la plupart des tests échoueront (et certains peuvent ne pas se terminer). Les seuls programmes de test connus pour fonctionner actuellement sont :
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
** Résultats attendus sur PPC64 Linux
"make check" devrait s'exécuter avec au maximum 10 échecs sur 24 tests.
Cette distribution inclut quelques tests de performance simples qui donnent une idée du coût de base des différentes opérations de libunwind. Après avoir construit la bibliothèque, vous pouvez exécuter ces tests avec les commandes suivantes :
$ cd tests $ make perf
Veuillez adresser toutes les questions concernant cette bibliothèque à :
Vous pouvez le faire en envoyant un mail à [email protected] avec le corps suivant :
subscribe libunwind-devel
ou vous pouvez vous abonner et gérer votre abonnement via l'interface web à :
https://savannah.nongnu.org/mail/?group=libunwind