
Многоархитектурная библиотека для развертывания стеков вызовов программ, обеспечивающая низкоуровневую отладку, анализ сбоев и исследования безопасности в системах Linux, FreeBSD и HP-UX.
-- mode: Outline --
Это версия 1.0 библиотеки unwind. Данная библиотека поддерживает несколько комбинаций архитектур/операционных систем:
Linux/x86-64: Работает хорошо. Linux/x86: Работает хорошо. Linux/ARM: Работает хорошо. Linux/IA-64: Полностью протестирована и поддерживается. Linux/PARISC: Работает хорошо, но в библиотеке C отсутствует unwind-info. HP-UX/IA-64: В основном работает, но известны серьёзные ограничения. Linux/AArch64: Недавно добавлена. Linux/PPC64: Недавно добавлена. Linux/SuperH: Недавно добавлена. FreeBSD/i386: Недавно добавлена. FreeBSD/x86-64: Недавно добавлена (архитектура FreeBSD известна как amd64).
В общем случае эту библиотеку можно собрать и установить с помощью следующих команд:
$ autoreconf -i # Требуется только при сборке из git. Зависит от libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
где PREFIX — это префикс установки. По умолчанию используется префикс /usr/local, так что libunwind.a устанавливается в /usr/local/lib, а unwind.h — в /usr/local/include. Для тестирования вы можете использовать префикс /usr/local.
** Версия 8 и новее
Начиная с версии 8, предпочтительное имя для компилятора Intel IA-64 — «icc» (такое же, как на x86). Таким образом, строка конфигурации должна выглядеть так:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
На данный момент libunwind должна собираться с GCC на HP-UX.
libunwind следует настраивать и устанавливать на HP-UX следующим образом:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Предостережение: размотка 32-битных (ILP32) бинарников в данный момент не поддерживается.
** Обходное решение для старых версий GCC
GCC v3.0 и GCC v3.2 поставляются с некорректной версией sys/types.h. Обходное решение — выполнить следующие команды перед запуском «configure»:
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 или новее исправлены и не требуют этого обходного решения.
Для сборки для power64 следует использовать:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Если ваш Power поддерживает регистры altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Чтобы проверить, поддерживает ли ваш процессор векторные регистры (altivec): cat /proc/cpuinfo | grep altivec и должно быть что-то вроде: cpu : PPC970, altivec supported
Если libunwind, кажется, не работает (трассировка стека не удаётся), попробуйте скомпилировать её с -O0, без оптимизаций. В зависимости от версии вашего gcc могут быть проблемы с компилятором.
Общие инструкции по сборке применимы. Для сборки и выполнения некоторых тестов требуется библиотека libexecinfo, доступная в портах как devel/libexecinfo.
Разработка порта велась на FreeBSD 8.0-STABLE. Библиотека собиралась как системным компилятором, который является модифицированной версией gcc 4.2.1, так и gcc 4.4.3.
После сборки библиотеки вы можете запустить набор регрессионных тестов с помощью:
$ make check
** Ожидаемые результаты на IA-64 Linux
Если у вас не установлена очень свежая библиотека C и компилятор, в настоящее время ожидается, что на IA-64 Linux следующие тесты будут провалены:
Gtest-init (должен проходить начиная с glibc-2.3.x/gcc-3.4)
Ltest-init (должен проходить начиная с glibc-2.3.x/gcc-3.4)
test-ptrace (должен проходить начиная с glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (должен проходить начиная с glibc-2.3.x)
Это не означает, что libunwind нельзя использовать со старыми компиляторами или библиотеками C, просто в определённых краевых случаях размотка будет неудачной. Поскольку это краевые случаи, приложения вряд ли их вызовут.
Примечание: Если вы получаете много ошибок в Gia64-test-nat и Lia64-test-nat, это почти наверняка признак старого ассемблера. GNU ассемблер раньше некорректно кодировал смещения относительно предыдущего указателя стека. Эта ошибка была исправлена 21 сентября 2004 года, так что любой более поздний ассемблер будет работать нормально.
** Ожидаемые результаты на x86 Linux
Ожидается, что на x86 Linux следующие тесты будут провалены:
Gtest-resume-sig (не удаётся получить SIGUSR2)
Ltest-resume-sig (аналогично)
Gtest-dyn1 (поддержка динамической unwind-info пока отсутствует)
Ltest-dyn1 (поддержка динамической unwind-info пока отсутствует)
test-setjmp (longjmp() пока не реализован)
run-check-namespace (нет _Ux86_getcontext пока)
test-ptrace
** Ожидаемые результаты на x86-64 Linux
Ожидается, что на x86-64 Linux следующие тесты будут провалены:
Gtest-dyn1 (поддержка динамической unwind-info пока отсутствует)
Ltest-dyn1 (поддержка динамической unwind-info пока отсутствует)
Gtest-init (см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (аналогично)
test-async-sig (аварийно завершается из-за некорректной unwind-info?)
test-setjmp (longjmp() пока не реализован)
run-check-namespace (нет _Ux86_64_getcontext пока)
run-ptrace-mapper (??? исследовать)
run-ptrace-misc (см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
и http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Ожидаемые результаты на PARISC Linux
Предостережение: на PA-RISC Linux требуется GCC v3.4 или новее. Более ранние версии компилятора не создавали заголовок программы обработки исключений (GNU_EH_FRAME), необходимый для размотки.
Ожидается, что на x86-64 Linux следующие тесты будут провалены:
Gtest-bt (трассировка стека обрезана на kill() из-за отсутствия unwind-info)
Ltest-bt (аналогично)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() работает некорректно)
Ltest-resume-sig (аналогично)
Gtest-init (аналогично)
Ltest-init (аналогично)
Gtest-dyn1 (поддержка динамической unwind-info пока отсутствует)
Ltest-dyn1 (поддержка динамической unwind-info пока отсутствует)
test-setjmp (longjmp() пока не реализован)
run-check-namespace (инструментарий не поддерживает HIDDEN пока)
** Ожидаемые результаты на HP-UX
«make check» в настоящее время не поддерживается для HP-UX. Вы можете попытаться запустить его, но большинство тестов будут провалены (а некоторые могут не завершиться). Единственные тестовые программы, которые, как известно, работают на данный момент:
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
** Ожидаемые результаты на PPC64 Linux
«make check» должен выполняться с не более чем 10 из 24 тестов, считающихся проваленными.
Этот дистрибутив включает несколько простых тестов производительности, которые дают некоторое представление о базовой стоимости различных операций libunwind. После сборки библиотеки вы можете запустить эти тесты с помощью следующих команд:
$ cd tests $ make perf
Пожалуйста, направляйте все вопросы, касающиеся этой библиотеки, по адресу:
Вы можете сделать это, отправив письмо на [email protected] с телом:
subscribe libunwind-devel
или вы можете подписаться и управлять своей подпиской через веб-интерфейс по адресу:
https://savannah.nongnu.org/mail/?group=libunwind