2011-10-10 24 views
23

कैसे प्राप्त करें मेरे पास एंड्रॉइड पर सी ++ कोडबेस चल रहा है, और उपयोगकर्ताओं द्वारा भेजी गई क्रैश रिपोर्ट प्राप्त करना चाहते हैं।मूल कोड - फ़ंक्शन कॉल स्टैक (बैकट्रैक) प्रोग्रामेटिक रूप से

मैं ACRA library का उपयोग कर रहा हूं जो जावा कोड के लिए ठीक काम करता है, लेकिन जब मूल कोड में कुछ क्रैश होता है, तो मुझे पर्याप्त जानकारी नहीं मिलती है। असल में मैं देशी फ़ंक्शन कॉल का स्टैक ट्रेस प्राप्त करना चाहता हूं। मुझे पता है कि मेरी प्रक्रिया समाप्त होने के बाद क्रैश जानकारी लॉगकैट में मुद्रित होती है, और मैं एसीआरए को लॉगकैट पढ़ने/भेजने के लिए कॉन्फ़िगर कर सकता हूं। मैंने सिग्नल हैंडलर का उपयोग करके देशी क्रैश का पता लगाने और ACRA द्वारा रिपोर्टिंग के लिए जावा पर वापस कॉल करने के लिए अपना कोड सेट अप किया है। यह भी ठीक काम करता है।

हालांकि इस दृष्टिकोण के साथ बुरा समय है - एसीआरए प्रक्रिया को तोड़ने के दौरान लॉग पढ़ता है, और एंड्रॉइड (बिल्कुल सही नहीं जानता) दुर्घटनाग्रस्त प्रक्रिया पूरी तरह खत्म होने के बाद क्रैक रिपोर्ट को लॉगकैट में लिखता है। तो मुझे ACRA का उपयोग करते समय स्टैक निशान प्राप्त नहीं होते हैं।

तो मैं सी ++ कोड से प्रोग्रामिक रूप से वर्तमान स्टैक ट्रेस को प्रोग्राम करने के लिए एक तरीका ढूंढ रहा हूं, और इस जानकारी को एसीआरए (या शायद अन्य क्रैश रिपोर्टिंग टूल) में खिला सकता हूं।

सभी मैं की जरूरत है इस रिपोर्ट logcat को पत्र लिखा किसी तरह का है:

10-10 08:29:13.868: INFO/DEBUG(1121):   #00 pc 0003fc7c /data/data/com.ex.lib/libapp.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #04 pc 00016df4 /system/lib/libdvm.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #05 pc 00045284 /system/lib/libdvm.so 
10-10 08:29:13.899: INFO/DEBUG(1121):   #15 pc 00047c56 /system/lib/libdvm.so 
10-10 08:29:13.922: INFO/DEBUG(1121):   #16 pc 00030e4c /system/lib/libandroid_runtime.so 

वहाँ किसी भी तरह से मेरे कोड से स्टैक ट्रेस प्राप्त करने के लिए है?

उत्तर

1

एसीआरए एप्लिकेशन क्रैशिंग को जाल कर सकता है। फिर आप एक दूसरी प्रक्रिया को तत्काल कर सकते हैं जो लॉगक को निष्पादित करेगा (this question देखें) कमांड, अपने एप्लिकेशन नाम से फ़िल्टरिंग, और उसके बाद आपको डंप की गई फ़ाइल भेजने की प्रक्रिया है। यह इष्टतम से दूर है क्योंकि:

  • आवेदन अवधि होता है कि logcat शायद उपयोगकर्ता एक नया प्रोग्राम स्थापित करने के लिए होने के लिए नाराज हो जाएगा

लेकिन WRITE_EXTERNAL_STORAGE और READ_LOGS अनुमतियाँ

  • होना आवश्यक है मुझे ऐसा करने का दूसरा विकल्प नहीं मिला।

  • +0

    यह आपके एपीके के भीतर परिभाषित दूसरी गतिविधि हो सकता है - –

    +0

    स्थापित करने के लिए किसी दूसरे ऐप की आवश्यकता नहीं है, लेकिन इसके लिए READ_LOGS की आवश्यकता होगी, चुड़ैल उपयोगकर्ताओं को कुछ संदेह पैदा कर सकता है – scooterman

    8

    मैं अपने खेल आधार परियोजना में यह किया है - आप JNI कोड जो इस यहाँ संभालती देख सकते हैं:

    https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/src/com/gmail/whittock/tom/Util/NativeActivity.java#cl-91

    : जो जावा विधि यहां बताए गए कॉल

    https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40

    समग्र समाधान सिग्नल को संभालने पर आधारित है, फिर सिग्नल हैंडलर में स्टैक ट्रेस इत्यादि को डंप करने के लिए जावा पर कॉल करने के लिए, मेरे कोड में मैं लॉगक जानकारी प्राप्त करने के लिए एक और गतिविधि शुरू करता हूं और मुझे यह ईमेल करें।

    +0

    क्या यह थोड़ा डरावना नहीं है सिग्नल हैंडलर के अंदर जावा विधि को कॉल करें? – Tapemaster

    संबंधित मुद्दे