
Многоплатформенная библиотека на C для разворачивания стека, генерации обратных трассировок и обработки исключений, используемая для отладки, профилирования и анализа бинарного кода в 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 должна выглядеть так:
$ ./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 (примечание: вероятно, ошибка в оригинале, должно быть PARISC 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