2013-10-01 6 views
7

में 'कोड' का अर्थ क्या है I एंड्रॉइड में इन 2 सेगमेंटेशन दोषों को देखते हैं। एक ने कहा SEGV_MAPERR, दूसरे ने कहा SEGV_ACCERR।सेगमेंटेशन फॉल्ट

क्या आप कृपया मुझे बता सकते हैं कि इन 2 के बीच अंतर क्या हैं?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 

धन्यवाद।

+0

'SEGV_MAPERR' एक स्मृति आवंटन त्रुटि है (पॉइंटर, मेमोरी ओवरफ्लो इत्यादि लटकाना), 'SEGV_ACCERR' एक स्मृति पहुंच त्रुटि है, आमतौर पर अनुमतियां। या आप कुछ और खोज रहे हैं? – Simon

+0

क्या यह कहना उचित है कि SEGV_ACCERR स्टैक भ्रष्टाचार के कारण होता है? – michael

+0

खैर, मुझे लगता है कि यह हो सकता है कि अगर आप स्मृति तक पहुंचने के लिए एक स्टैक पॉइंटर का उपयोग करते हैं, तो आपके पास कोई अनुमति नहीं है, लेकिन ऐसा लगता है कि यह असंभव है। तुम क्या कर रहे हो? – Simon

उत्तर

12

प्रति siginfo.h:

SEGV_MAPERR मतलब है कि आप एक पते कि कुछ भी करने के लिए नक्शे नहीं है का उपयोग करने की कोशिश की।

SEGV_ACCERR का अर्थ है कि आपने उस पते तक पहुंचने का प्रयास किया है जिसके पास आपको एक्सेस करने की अनुमति नहीं है।

तो दोनों मामलों में आपने एक ऐसे पते तक पहुंचाया जो आपके पास नहीं होना चाहिए, जो संभवतः एकमात्र चीज है जिसका आपका वास्तविक कोड दोषी है। पूर्व मामले में वैसे भी उस पते सीमा में कोई स्मृति नहीं है। बाद के मामले में उस पते की सीमा में स्मृति है लेकिन आपके पास इसका स्वामित्व नहीं है।

यदि आप एक यादृच्छिक पते तक पहुंचने के लिए थे तो आप जो प्राप्त करते हैं उस पर निर्भर करता है कि ओएस उस समय आपकी प्रक्रिया को कैसे स्थापित करता है।

0

यदि आप *((int*)0)=1 जैसी मेमोरी एक्सेस करते हैं, तो आपको SEGV_MAPERR मिल जाएगा।

आप mprotect(2) के साथ एक स्मृति संरक्षित हैं, उदाहरण के लिए, mprotect(buffer, pagesize, PROT_READ), तो आप स्मृति *(buffer)=1 तरह संशोधित, आप SEGV_ACCERR मिल जाएगा।

विवरण के लिए man mprotect कृपया।

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