आपको सीजीवी प्राप्त करने पर कोड निष्पादित करने के लिए SIGSEGV को फंसाने से शुरू करना होगा। यह POSIX कोड है, इसलिए कुछ इसी तरह एंड्रॉयड पर काम करना चाहिए:
void abortHandler(int signum, siginfo_t* si, void* unused)
{
const char* name = NULL;
switch(signum)
{
case SIGABRT: name = "SIGABRT"; break;
case SIGSEGV: name = "SIGSEGV"; break;
case SIGBUS: name = "SIGBUS"; break;
case SIGILL: name = "SIGILL"; break;
case SIGFPE: name = "SIGFPE"; break;
case SIGPIPE: name = "SIGPIPE"; break;
}
if (name)
printf(stderr, "Caught signal %d (%s)\n", signum, name);
else
printf(stderr, "Caught signal %d\n", signum);
printStackTrace(stderr);
exit(signum);
}
void handleCrashes()
{
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = abortHandler;
sigemptyset(&sa.sa_mask);
sigaction(SIGABRT, &sa, NULL);
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGBUS, &sa, NULL);
sigaction(SIGILL, &sa, NULL);
sigaction(SIGFPE, &sa, NULL);
sigaction(SIGPIPE, &sa, NULL);
}
अगली बात संकेत संचालकों रजिस्टर करने के लिए है कि समारोह कॉल करने के लिए है। आप इसे मुख्य में पहली चीज़ के रूप में कर सकते हैं, लेकिन फिर आपको मुख्य तक स्टैक निशान नहीं मिलेंगे। यदि आप उन्हें पहले चाहते हैं, तो आप इस फ़ंक्शन को वैश्विक ऑब्जेक्ट के निर्माता से कॉल कर सकते हैं। लेकिन इस बात की कोई गारंटी नहीं है कि यह पहला कन्स्ट्रक्टर होगा। यह सुनिश्चित करने के तरीके हैं कि इसे जल्दी कहा जाता है। उदाहरण के लिए, अधिभार ऑपरेटर नया - डीबग बिल्ड में - पहले आवंटन पर पहले स्टैक निशान शुरू करने के लिए, और फिर असली ऑपरेटर को नए में कॉल करें। यह आपको पहले आवंटन से शुरू होने वाले स्टैक निशान देगा।
void printStackTrace(unsigned int max_frames = 63)
{
void* addrlist[max_frames+1];
// retrieve current stack addresses
u32 addrlen = backtrace(addrlist, sizeof(addrlist)/sizeof(void*));
if (addrlen == 0)
{
printf(stderr, " <empty, possibly corrupt>\n");
return;
}
char** symbollist = backtrace_symbols(addrlist, addrlen);
for (u32 i = 3; i < addrlen; i++)
printf(stderr, "%s\n", symbollist[i]):
}
आप उन्हें पठनीय बनाने के लिए प्रतीकों demangle के लिए और अधिक काम करने की आवश्यकता होगी:
एक स्टैक ट्रेस मुद्रित करने के लिए। abi :: __ cxa_demangle आज़माएं। निश्चित रूप से -g और साथ-साथ लिंक के साथ लिंक।
इस उत्तर को चेक करें। यह विशेष रूप से एंड्रॉइड http://stackoverflow.com/a/28858941/365229 –