حزمة ndk

تتيح لك أداة ndk-stack ترميز عمليات تتبُّع تسلسل استدعاء الدوال البرمجية من adb logcat أو شهد ضريح في /data/tombstones/. يستبدل أي عنوان داخل مكتبة مشتركة بالاسم <source-file>:<line-number> المقابل من رمز المصدر، ما يجعل تصحيح الأخطاء أسهل.

على سبيل المثال، تترجم العبارة التالية:

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
I/DEBUG   (   31): pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), fault addr 0d9f00d8
I/DEBUG   (   31):  r0 0000af88  r1 0000a008  r2 baadf00d  r3 0d9f00d8
I/DEBUG   (   31):  r4 00000004  r5 0000a008  r6 0000af88  r7 00013c44
I/DEBUG   (   31):  r8 00000000  r9 00000000  10 00000000  fp 00000000
I/DEBUG   (   31):  ip 0000959c  sp be956cc8  lr 00008403  pc 0000841e  cpsr 60000030
I/DEBUG   (   31):          #00  pc 0000841e  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #01  pc 000083fe  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #02  pc 000083f6  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #03  pc 000191ac  /system/lib/libc.so
I/DEBUG   (   31):          #04  pc 000083ea  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #05  pc 00008458  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #06  pc 0000d362  /system/lib/libc.so
I/DEBUG   (   31):

إلى محتوى أكثر سهولة في القراءة:

********** Crash dump: **********
Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<
signal 11 (SIGSEGV), fault addr 0d9f00d8
Stack frame #00  pc 0000841e  /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13
Stack frame #01  pc 000083fe  /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5
Stack frame #02  pc 000083f6  /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9
Stack frame #03  pc 000191ac  /system/lib/libc.so
Stack frame #04  pc 000083ea  /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14
Stack frame #05  pc 00008458  /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19
Stack frame #06  pc 0000d362  /system/lib/libc.so

الاستخدام

لاستخدام ndk-stack، تحتاج أولاً إلى دليل يحتوي على إصدارات لم تتم إزالة البيانات غير الضرورية منها من مكتبات تطبيقك المشتركة. إذا كنت تستخدم ndk-build، يمكنك العثور على مكتبات ملف APK المشترَكة غير المُعرَّاة في $PROJECT_PATH/obj/local/<abi>، حيث يكون <abi> هو ABI لجهازك.

بالنسبة إلى عملية إنشاء مكوّن إضافي لنظام Gradle المتوافق مع Android (AGP)، ستكون المكتبات التي لم تتم إزالتها في directory <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>، حيث يكون <project-path> هو دليل مشروع AGP الذي يحتوي على الوحدة التي تحاول ترميزها (يكون هذا تلقائيًا هو app)، و<build-type> هو اسم نوع التصميم CMake أو ndk-build (مثل RelWithDebInfo أو Release أو Debug أو غير ذلك). <hash> هو رقم عشوائي، و<abi> هو معرّف ABI لجهازك.

هناك طريقتان لاستخدام الأداة. يمكنك إرسال نص logcat كإدخال مباشر إلى البرنامج. مثلاً:

adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a

يمكنك أيضًا استخدام الخيار -dump لتحديد سجلّ Logcat كملف إدخال. مثلاً:

adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a -dump foo.txt

عند بدء تحليل إخراج logcat، تبحث الأداة عن سطر أولي من العلامات النجمية. مثلاً:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

ملاحظة: عند نسخ عمليات التتبّع أو لصقها، لا تنسَ هذا السطر، وإلا لن تعمل ndk-stack بشكل صحيح.

مزيد من المعلومات

يستخدم Google Play أداة ndk-stack لترميز عمليات تتبُّع تسلسل استدعاء الدوال البرمجية للتطبيقات الأصلية في Google Play Console. للحصول على معلومات عن كيفية تفعيل هذه الميزة لتطبيقك في بيئة الإنتاج، اطّلِع على كيفية تضمين ملف رموز تصحيح أخطاء أصلية لتطبيقك في Google Play Console.