अपडेट करें
मुझे ओपी में उल्लिखित डिबग.सी में लाइन मिली और हम इस कोड के ऊपर की दो पंक्तियों से देख सकते हैं:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
और वही कोड _redisPanic
. में पाया जा सकता है साथ ही, इसलिए यह एक SIGSEGV
. को बाध्य करने का उनका तरीका लगता है जब कोई दावा विफल हो जाता है या घबराहट होती है।
मूल
यह एक डिबगिंग टूल की तरह दिखता है, हम इस दस्तावेज़ से देख सकते हैं Redis डिबगिंग गाइड और संबंधित अनुभाग कहता है:
<ब्लॉकक्वॉट>Redis के पास DEBUG SEGFAULT कमांड का उपयोग करके सेगमेंटेशन फॉल्ट (दूसरे शब्दों में एक खराब क्रैश) का अनुकरण करने के लिए एक कमांड है (निश्चित रूप से वास्तविक उत्पादन उदाहरण के खिलाफ इसका उपयोग न करें;)। इसलिए मैं इस कमांड का उपयोग अपने इंस्टेंस को क्रैश करने के लिए करूँगा ताकि यह दिखाया जा सके कि GDB पक्ष में क्या होता है:
और यह gdb आउटपुट दिखाता है:
(gdb) continue
Continuing.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffffffffff
debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
^^^^^^^^^^^^^^^^^^^
यह क्या कर रहा है -1
casting कास्टिंग कर रहा है एक *चार ** और फिर उस पर अप्रत्यक्ष रूप से प्रदर्शन करना और 'x'
. असाइन करना उस स्मृति स्थान पर। जिस धागे से एल्क जुड़ा हुआ है, क्या वह ((शून्य *) -1) एक वैध पता है? अधिकांश प्रणालियों पर कहते हैं कि यह एक्सेस करने के लिए मान्य नहीं होगा, अकेले ही मान निर्दिष्ट करें। यह अधिकांश आधुनिक ऑपरेटिंग सिस्टम पर विभाजन दोष उत्पन्न करेगा।
यह अपरिभाषित व्यवहार है और जैसा कि धागे में खत्म हो गया था सी में सेगफॉल्ट बनाने का सबसे सरल मानक अनुरूप तरीका क्या है? उस पर भरोसा नहीं किया जा सकता। कंपाइलर स्मार्ट हो रहे हैं और कुछ प्रसिद्ध उदाहरण हैं जहां कंपाइलर अप्रत्याशित और बुरे तरीकों से अपरिभाषित व्यवहार का शोषण करने के बारे में स्मार्ट है।