एनडीके-स्टैक

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 का इस्तेमाल करने पर, शेयर की गई ये लाइब्रेरी $PROJECT_PATH/obj/local/<abi> में मिलती हैं, जहां <abi> आपके डिवाइस का एबीआई है.

'Android Gradle प्लग इन (AGP)' के बिल्ड के लिए, बिना स्ट्राइप वाली लाइब्रेरी <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi> में होंगी. यहां <project-path>, AGP प्रोजेक्ट की डायरेक्ट्री होगी जिसमें वह मॉड्यूल शामिल होगा जिसे सिंबल दिखाने की कोशिश की जा रही है (डिफ़ॉल्ट रूप से यह app है). <build-type>, CMake या ndk-build बिल्ड टाइप का नाम है (जैसे कि RelWithDebInfo, Release, Debug वगैरह), <hash> कोई भी वैल्यू हो सकती है और <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

जब यह लॉगकैट आउटपुट को पार्स करना शुरू करता है, तो यह टूल तारे के निशान की शुरुआती लाइन खोजता है. उदाहरण के लिए:

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

ध्यान दें: ट्रेस को कॉपी/पेस्ट करते समय, इस लाइन को न भूलें. अगर ऐसा नहीं है, तो ndk-stack सही तरीके से काम नहीं करेगा.

ज़्यादा जानकारी

Google Play Console में नेटिव ऐप्लिकेशन के स्टैक ट्रेस दिखाने के लिए, Google Play ndk-stack का इस्तेमाल करता है. प्रोडक्शन एनवायरमेंट में अपने ऐप्लिकेशन के लिए, इसे चालू करने का तरीका जानने के लिए, Google Play Console में अपने ऐप्लिकेशन के लिए नेटिव डीबग सिंबल फ़ाइल शामिल करने का तरीका देखें.