मैं डीबगिंग उद्देश्य के लिए अपने एंड्रॉइड एनडीके ऐप में SIGSEGV जैसे संकेतों को पकड़ने की कोशिश कर रहा हूं। इसके लिए, मैंने एक सिग्नेशन स्थापित किया है जिसे बुलाया जाता है।एंड्रॉइड _Unwind_Backtrace सिग्नेशन के अंदर
अब मैं कॉल का ढेर पाने की कोशिश कर रहा हूं। समस्या यह है कि _Unwind_Backtrace
केवल वर्तमान स्टैक पर काम करता है और सिग्नेशन अपने स्वयं के ढेर के अंदर चलता है।
तो, क्या सिग्नल प्राप्त करने वाले निष्पादन सूचक के ढेर को पाने का कोई तरीका है? (मूल रूप से _Unwind_Backtrace
बता वर्तमान की तुलना में एक और स्टैक के लिए?)
मैं कहना चाहिए कि:
backtrace()
का उपयोग करना औरbacktrace_symbols()
एक विकल्प के बाद से उन कार्यों एंड्रॉयड NDK में नहीं दिया जाता है नहीं है
मैं अपने स्थानीय उपकरणों पर दुर्घटनाओं की जांच के लिए जीडीबी का उपयोग कर रहा हूं। मैं जीडीबी को प्रतिस्थापित नहीं करना चाहता, मैं क्लाइंट से अर्थपूर्ण स्टैक निशान प्राप्त करने में सक्षम होना चाहता हूं जब मैं उसे टेस्ट बिल्ड भेजता हूं।
संपादित करें: मैं के रूप में FADDEN द्वारा प्रस्तावित लेकिन जब मैं का उपयोग यह unwind_backtrace_signal_arch समारोह है, मैं एक अजीब पश्व-अनुरेखन कि दुर्घटना का प्रतिनिधित्व नहीं करते प्राप्त प्रणाली/कोर से Android के libcorkscrew उपयोग करने की कोशिश की है।
मैंने खोज की है लेकिन मैं आपके उत्तर से यह नहीं समझ सकता कि कैसे एक ucontext सूचक के साथ एक ढेर को खोलना है। क्या आप कोई उदाहरण देते हैं? –
ucontext.h बायोनिक में प्रदान नहीं किया गया है, जो एंड्रॉइड का उपयोग करता है। मुझे इस प्लेटफॉर्म पर इस संरचना से जानकारी खींचने में भी बहुत दिलचस्पी है जहां संरचना मौजूद नहीं है। क्या मुझे विश्वास है कि यह वही सदस्य आदेश है जो लिनक्स में है, और बस पीसी और एसपी को स्मृति पते से बाहर खींचें? – codetaku
ucontext।एच बायोनिक का हिस्सा है, हालांकि यह एनडीके से उपलब्ध नहीं हो सकता है (https://android.googlesource.com/platform/bionic/+/kitkat-release/libc/kernel/arch-arm/asm/ucontext.h देखें)। ऐसा नहीं है कि यह बहुत अच्छा करता है - इसकी बजाय सामान्य परिभाषा है। AFAIK में ucontext के लिए कोई एंड्रॉइड-विशिष्ट अनुकूलन नहीं है। – fadden