
Libreria C per lo stack unwinding e la generazione di backtrace, con supporto per multiple architetture e sistemi operativi, incluse istruzioni per la compilazione e i test di regressione.
-- mode: Outline --
Questa è la versione 1.0 della libreria unwind. Questa libreria supporta diverse combinazioni architettura/sistema operativo:
Linux/x86-64: Funziona bene. Linux/x86: Funziona bene. Linux/ARM: Funziona bene. Linux/IA-64: Completamente testato e supportato. Linux/PARISC: Funziona bene, ma la libreria C manca di unwind-info. HP-UX/IA-64: Funziona per lo più ma ha alcune limitazioni serie note. Linux/AArch64: Aggiunto di recente. Linux/PPC64: Aggiunto di recente. Linux/SuperH: Aggiunto di recente. FreeBSD/i386: Aggiunto di recente. FreeBSD/x86-64: Aggiunto di recente (l'architettura FreeBSD è nota come amd64).
In generale, questa libreria può essere compilata e installata con i seguenti comandi:
$ autoreconf -i # Necessario solo per compilare da git. Dipende da libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
dove PREFIX è il prefisso di installazione. Per impostazione predefinita viene utilizzato un prefisso di /usr/local, in modo che libunwind.a venga installato in /usr/local/lib e unwind.h venga installato in /usr/local/include. Per i test, potresti voler utilizzare un prefisso di /usr/local invece.
** Versione 8 e successive
A partire dalla versione 8, il nome preferito per il compilatore Intel IA-64 è "icc" (lo stesso nome di x86). Pertanto, la riga di configure dovrebbe essere simile a questa:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Per il momento, libunwind deve essere compilato con GCC su HP-UX.
libunwind dovrebbe essere configurato e installato su HP-UX in questo modo:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Avvertenza: Lo srotolamento di binari a 32 bit (ILP32) non è supportato al momento.
** Workaround per versioni precedenti di GCC
GCC v3.0 e GCC v3.2 sono forniti con una versione difettosa di sys/types.h. Il workaround consiste nell'eseguire i seguenti comandi prima di eseguire "configure":
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 o successivi sono stati corretti e non richiedono questo workaround.
Per compilare per power64 dovresti usare:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Se il tuo power supporta i registri altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Per verificare se il tuo processore supporta i registri vettoriali (altivec): cat /proc/cpuinfo | grep altivec e dovresti vedere qualcosa come: cpu : PPC970, altivec supported
Se libunwind sembra non funzionare (fallimento del backtracing), prova a compilarlo con -O0, senza ottimizzazioni. Ci sono alcuni problemi del compilatore a seconda della versione del tuo gcc.
Si applicano le istruzioni generali di compilazione. Per compilare ed eseguire diversi test, è necessaria la libreria libexecinfo disponibile nelle porte come devel/libexecinfo.
Lo sviluppo della porta è stato fatto su FreeBSD 8.0-STABLE. La libreria è stata compilata con il compilatore di sistema che è una versione modificata di gcc 4.2.1, così come con gcc 4.4.3.
Dopo aver compilato la libreria, puoi eseguire una serie di test di regressione con:
$ make check
** Risultati attesi su IA-64 Linux
A meno che tu non abbia una libreria C e un compilatore molto recenti, è attualmente previsto il fallimento dei seguenti test su IA-64 Linux:
Gtest-init (dovrebbe passare a partire da glibc-2.3.x/gcc-3.4)
Ltest-init (dovrebbe passare a partire da glibc-2.3.x/gcc-3.4)
test-ptrace (dovrebbe passare a partire da glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (dovrebbe passare a partire da glibc-2.3.x)
Questo non significa che libunwind non possa essere utilizzato con compilatori o librerie C più vecchi, significa solo che per alcuni casi particolari, lo srotolamento fallirà. Dato che sono casi limite, è improbabile che le applicazioni li incontrino.
Nota: Se ottieni molti errori in Gia64-test-nat e Lia64-test-nat, è quasi sicuramente un segno di un assemblatore vecchio. L'assemblatore GNU codificava erroneamente gli offset relativi al puntatore dello stack precedente. Questo bug è stato corretto il 21-Set-2004, quindi qualsiasi assemblatore successivo andrà bene.
** Risultati attesi su x86 Linux
I seguenti test dovrebbero fallire su x86 Linux:
Gtest-resume-sig (non riesce a ottenere SIGUSR2)
Ltest-resume-sig (allo stesso modo)
Gtest-dyn1 (nessun supporto per unwind-info dinamico ancora)
Ltest-dyn1 (nessun supporto per unwind-info dinamico ancora)
test-setjmp (longjmp() non ancora implementato)
run-check-namespace (nessun _Ux86_getcontext ancora)
test-ptrace
** Risultati attesi su x86-64 Linux
I seguenti test dovrebbero fallire su x86-64 Linux:
Gtest-dyn1 (nessun supporto per unwind-info dinamico ancora)
Ltest-dyn1 (nessun supporto per unwind-info dinamico ancora)
Gtest-init (vedi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (allo stesso modo)
test-async-sig (si blocca a causa di unwind-info errato?)
test-setjmp (longjmp() non ancora implementato)
run-check-namespace (nessun _Ux86_64_getcontext ancora)
run-ptrace-mapper (??? da indagare)
run-ptrace-misc (vedi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
e http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Risultati attesi su PARISC Linux
Avvertenza: GCC v3.4 o successivo è necessario su PA-RISC Linux. Versioni precedenti del compilatore non generavano l'intestazione del programma per la gestione delle eccezioni (GNU_EH_FRAME) necessaria per lo srotolamento.
I seguenti test dovrebbero fallire su x86-64 Linux:
Gtest-bt (backtrace troncato a kill() a causa della mancanza di unwind-info)
Ltest-bt (allo stesso modo)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() è in qualche modo errato)
Ltest-resume-sig (allo stesso modo)
Gtest-init (allo stesso modo)
Ltest-init (allo stesso modo)
Gtest-dyn1 (nessun supporto per unwind-info dinamico ancora)
Ltest-dyn1 (nessun supporto per unwind-info dinamico ancora)
test-setjmp (longjmp() non ancora implementato)
run-check-namespace (la toolchain non supporta ancora HIDDEN)
** Risultati attesi su HP-UX
"make check" non è attualmente supportato per HP-UX. Puoi provare a eseguirlo, ma la maggior parte dei test fallirà (e alcuni potrebbero non terminare). I soli programmi di test che si sa funzionano al momento sono:
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
** Risultati attesi su PPC64 Linux
"make check" dovrebbe essere eseguito con non più di 10 test falliti su 24.
Questa distribuzione include alcuni semplici test di prestazione che danno un'idea del costo base di varie operazioni di libunwind. Dopo aver compilato la libreria, puoi eseguire questi test con i seguenti comandi:
$ cd tests $ make perf
Per favore, indirizza tutte le domande riguardanti questa libreria a:
Puoi farlo inviando una mail a [email protected] con un corpo di:
subscribe libunwind-devel
oppure puoi iscriverti e gestire la tua iscrizione tramite l'interfaccia web all'indirizzo:
https://savannah.nongnu.org/mail/?group=libunwind