
مكتبة لفك تكديس استدعاءات المعالج، تدعم بنى معمارية وأنظمة تشغيل متعددة، مع تعليمات البناء والاختبار الانحداري.
-- 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"
تحذير: إلغاء الترجيع (unwinding) للثنائيات 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 المتاحة في ports باسم 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، فهذا مؤشر شبه مؤكد على وجود مُجمّع (assembler) قديم. كان مُجمّع GNU يشفر إزاحات المؤشر السابق-للحزمة (previous-stack-pointer-relative offsets) بشكل غير صحيح. تم إصلاح هذا الخطأ في 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
تحذير: مطلوب GCC v3.4 أو أحدث على PA-RISC Linux. فشلت الإصدارات الأقدم من المترجم في إنشاء رأس برنامج معالجة الاستثناءات (GNU_EH_FRAME) اللازم لإلغاء الترجيع.
من المتوقع فشل الاختبارات التالية على x86-64 Linux:
Gtest-bt (تتبع التكدس مقطوع عند kill() بسبب نقص معلومات unwind)
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