
Библиотека для размотки стеков вызовов процессора, поддерживающая несколько архитектур и операционных систем, с инструкциями по сборке и регрессионному тестированию.
-- 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 должна выглядеть так:
$ ./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"
Если ваш процессор поддерживает регистры 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)
Ltest-dyn1 (пока нет поддержки динамической информации unwind)
test-setjmp (longjmp() ещё не реализован)
run-check-namespace (нет _Ux86_getcontext)
test-ptrace
** Ожидаемые результаты на x86-64 Linux
Ожидается, что на x86-64 Linux следующие тесты завершатся неудачей:
Gtest-dyn1 (пока нет поддержки динамической информации unwind)
Ltest-dyn1 (пока нет поддержки динамической информации unwind)
Gtest-init (см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (аналогично)
test-async-sig (падает из-за плохой информации unwind?)
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)
Ltest-dyn1 (пока нет поддержки динамической информации unwind)
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