x86 पर सिगबस (x86_64 सहित) लिनक्स एक दुर्लभ जानवर है। यह mmap
एड फ़ाइल, या POSIX द्वारा वर्णित कुछ अन्य स्थितियों के अंत तक पहुंचने के प्रयास से दिखाई दे सकता है।
लेकिन हार्डवेयर दोषों से सिगबस प्राप्त करना आसान नहीं है। अर्थात्, किसी भी निर्देश से अनचाहे पहुंच - चाहे वह सिम हो या नहीं - आमतौर पर SIGSEGV में परिणाम होता है। एसआईजीएसईजीवी में स्टैक ओवरफ्लो परिणाम। एसआईजीएसईजीवी में कैनोलिक फॉर्म नतीजे में न होने वाले पते तक पहुंच भी है। यह सब #GP के कारण उठाया जा रहा है, जो लगभग हमेशा SIGSEGV को मानचित्र करता है।
अब, here're कुछ मायनों SIGBUS पाने के लिए एक सीपीयू अपवाद के कारण:
EFLAGS
में एसी बिट सक्षम है, तो पढ़ने के लिए या अनुदेश लिखने किसी भी स्मृति द्वारा असंरेखित पहुंच है। विवरण के लिए this discussion देखें।
स्टैक पॉइंटर रजिस्टर (rsp
या rbp
) के माध्यम से कैनोलिक उल्लंघन करें, #SS उत्पन्न करना।यहाँ जीसीसी के लिए एक उदाहरण (gcc test.c -o test -masm=intel
साथ संकलन) है:
int main()
{
__asm__("mov rbp,0x400000000000000\n"
"mov rax,[rbp]\n"
"ud2\n");
}
डीबगर ने दिखाया कि SIGBUS फ़ंक्शन में प्रवेश करने के तुरंत बाद हुआ था। हो सकता है कि मेरे पास कुछ स्मृति भ्रष्टाचार हो, या शायद फ़ंक्शन पैरामीटर में से एक खराब है? अगर त्रुटि फिर से होती है तो मुझे अधिक जानकारी के लिए डिबगर में डिस्सेप्लर की जांच करनी होगी। –
@ जोश - यह देखने के लिए जांचें कि वास्तविक असफल निर्देश क्या है - यदि यह पुश या पॉप है, तो आपका स्टैक पॉइंटर दूषित हो गया है। अगर यह कुछ और है, तो निर्देश में पता मुद्दा है। –