
Mehrarchitektur-C-Bibliothek für Stack-Unwinding, Backtrace-Generierung und Ausnahmebehandlung, verwendet für Debugging, Profiling und Binäranalyse unter Linux, FreeBSD und HP-UX.
-- mode: Outline --
Dies ist Version 1.0 der unwind-Bibliothek. Diese Bibliothek unterstützt mehrere Architektur/Betriebssystem-Kombinationen:
Linux/x86-64: Funktioniert gut. Linux/x86: Funktioniert gut. Linux/ARM: Funktioniert gut. Linux/IA-64: Vollständig getestet und unterstützt. Linux/PARISC: Funktioniert gut, aber die C-Bibliothek fehlt unwind-info. HP-UX/IA-64: Funktioniert größtenteils, hat aber bekanntermaßen einige ernsthafte Einschränkungen. Linux/AArch64: Neu hinzugefügt. Linux/PPC64: Neu hinzugefügt. Linux/SuperH: Neu hinzugefügt. FreeBSD/i386: Neu hinzugefügt. FreeBSD/x86-64: Neu hinzugefügt (FreeBSD-Architektur ist bekannt als amd64).
Im Allgemeinen kann diese Bibliothek mit den folgenden Befehlen erstellt und installiert werden:
$ autoreconf -i # Nur für das Bauen aus git erforderlich. Hängt von libtool ab.
$ ./configure
$ make
$ make install prefix=PREFIX
wobei PREFIX das Installationspräfix ist. Standardmäßig wird ein Präfix von /usr/local verwendet, so dass libunwind.a in /usr/local/lib und unwind.h in /usr/local/include installiert wird. Für Tests möchten Sie möglicherweise ein Präfix von /usr/local verwenden.
** Version 8 und höher
Ab Version 8 lautet der bevorzugte Name für den IA-64 Intel-Compiler "icc" (gleicher Name wie auf x86). Daher sollte die configure-Zeile wie folgt aussehen:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Zurzeit muss libunwind auf HP-UX mit GCC gebaut werden.
libunwind sollte auf HP-UX wie folgt konfiguriert und installiert werden:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Achtung: Das Entwinden von 32-Bit (ILP32) Binärdateien wird derzeit nicht unterstützt.
** Workaround für ältere Versionen von GCC
GCC v3.0 und GCC v3.2 werden mit einer fehlerhaften Version von sys/types.h ausgeliefert. Der Workaround besteht darin, die folgenden Befehle vor dem Ausführen von "configure" auszuführen:
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 oder höher wurde korrigiert und benötigt diesen Workaround nicht.
Für das Bauen für power64 sollten Sie verwenden:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Wenn Ihr Power altivec-Register unterstützt: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Um zu überprüfen, ob Ihr Prozessor Vektorregister (altivec) unterstützt: cat /proc/cpuinfo | grep altivec und sollte so etwas haben: cpu : PPC970, altivec supported
Wenn libunwind nicht zu funktionieren scheint (Backtracing schlägt fehl), versuchen Sie es ohne Optimierungen mit -O0 zu kompilieren. Es gibt einige Compilerprobleme, abhängig von der Version Ihres gcc.
Die allgemeinen Bauanweisungen gelten. Um mehrere Tests zu bauen und auszuführen, benötigen Sie die libexecinfo-Bibliothek, die in den Ports als devel/libexecinfo verfügbar ist.
Die Entwicklung des Ports wurde auf FreeBSD 8.0-STABLE durchgeführt. Die Bibliothek wurde mit dem Systemcompiler, einer modifizierten Version von gcc 4.2.1, sowie mit gcc 4.4.3 gebaut.
Nach dem Bauen der Bibliothek können Sie eine Reihe von Regressionstests ausführen mit:
$ make check
** Erwartete Ergebnisse auf IA-64 Linux
Sofern Sie keine sehr aktuelle C-Bibliothek und Compiler installiert haben, wird erwartet, dass die folgenden Tests auf IA-64 Linux fehlschlagen:
Gtest-init (sollte ab glibc-2.3.x/gcc-3.4 bestehen)
Ltest-init (sollte ab glibc-2.3.x/gcc-3.4 bestehen)
test-ptrace (sollte ab glibc-2.3.x/gcc-3.4 bestehen)
run-ia64-test-dyn1 (sollte ab glibc-2.3.x bestehen)
Dies bedeutet nicht, dass libunwind nicht mit älteren Compilern oder C-Bibliotheken verwendet werden kann, sondern nur, dass das Entwinden in bestimmten Randfällen fehlschlägt. Da es sich um Randfälle handelt, ist es unwahrscheinlich, dass Anwendungen sie auslösen.
Hinweis: Wenn Sie viele Fehler in Gia64-test-nat und Lia64-test-nat erhalten, ist dies fast sicher ein Zeichen für einen alten Assembler. Der GNU-Assembler codierte früher Offsets relativ zum vorherigen Stack-Zeiger falsch. Dieser Fehler wurde am 21-Sep-2004 behoben, daher ist jeder neuere Assembler in Ordnung.
** Erwartete Ergebnisse auf x86 Linux
Die folgenden Tests werden voraussichtlich auf x86 Linux fehlschlagen:
Gtest-resume-sig (kann SIGUSR2 nicht empfangen)
Ltest-resume-sig (ebenso)
Gtest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
Ltest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
test-setjmp (longjmp() noch nicht implementiert)
run-check-namespace (noch kein _Ux86_getcontext)
test-ptrace
** Erwartete Ergebnisse auf x86-64 Linux
Die folgenden Tests werden voraussichtlich auf x86-64 Linux fehlschlagen:
Gtest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
Ltest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
Gtest-init (siehe http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (ebenso)
test-async-sig (stürzt aufgrund fehlerhafter unwind-info ab?)
test-setjmp (longjmp() noch nicht implementiert)
run-check-namespace (noch kein _Ux86_64_getcontext)
run-ptrace-mapper (??? untersuchen)
run-ptrace-misc (siehe http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
und http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Erwartete Ergebnisse auf PARISC Linux
Achtung: GCC v3.4 oder neuer wird auf PA-RISC Linux benötigt. Frühere Versionen des Compilers erzeugten nicht den für das Entwinden erforderlichen Exception-Handling-Programm-Header (GNU_EH_FRAME).
Die folgenden Tests werden voraussichtlich auf x86-64 Linux fehlschlagen:
Gtest-bt (Backtrace abgeschnitten bei kill() aufgrund fehlender unwind-info)
Ltest-bt (ebenso)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() ist irgendwie falsch)
Ltest-resume-sig (ebenso)
Gtest-init (ebenso)
Ltest-init (ebenso)
Gtest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
Ltest-dyn1 (noch keine dynamische unwind-info-Unterstützung)
test-setjmp (longjmp() noch nicht implementiert)
run-check-namespace (Toolchain unterstützt HIDDEN noch nicht)
** Erwartete Ergebnisse auf HP-UX
"make check" wird derzeit für HP-UX nicht unterstützt. Sie können versuchen, es auszuführen, aber die meisten Tests werden fehlschlagen (und einige werden möglicherweise nicht terminieren). Die einzigen Testprogramme, die derzeit bekanntermaßen funktionieren, sind:
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
** Erwartete Ergebnisse auf PPC64 Linux
"make check" sollte ohne mehr als 10 von 24 fehlgeschlagenen Tests ausgeführt werden.
Diese Distribution enthält einige einfache Leistungstests, die eine Vorstellung von den grundlegenden Kosten verschiedener libunwind-Operationen geben. Nach dem Bauen der Bibliothek können Sie diese Tests mit den folgenden Befehlen ausführen:
$ cd tests $ make perf
Bitte richten Sie alle Fragen zu dieser Bibliothek an:
Sie können dies tun, indem Sie eine E-Mail an [email protected] mit folgendem Inhalt senden:
subscribe libunwind-devel
oder Sie können sich über die Weboberfläche unter folgender Adresse anmelden und Ihr Abonnement verwalten:
https://savannah.nongnu.org/mail/?group=libunwind