2014-10-20 4 views
5

मैंने अपने क्यूटी अनुप्रयोग के विंडोज़ बिल्ड में मिनी-कोर-डंप फीचर (__try/__ को छोड़कर और मिनीडंपवाइट डंप() के माध्यम से) जोड़ा है, ताकि अगर मेरा एप्लिकेशन कभी भी क्रैश हो जाए, तो एक .dmp फ़ाइल लिखी जाएगी मेरे लिए बाद में देखने और डीबग करने के लिए डिस्क पर।जानबूझकर मेरे विंडोज़ एप्लिकेशन को क्रैश करने का सबसे अच्छा तरीका क्या है?

यह बहुत अच्छी तरह से काम करता है, लेकिन परीक्षण के लिए मैं अपने प्रोग्राम को क्रैश करने के लिए एक ज्ञात-विश्वसनीय विधि चाहता हूं। उदाहरण के लिए, जीयूआई में "क्रैश अब" बटन हो सकता है और जब उपयोगकर्ता इसे क्लिक करता है, तो यह एप्लिकेशन को जानबूझकर दुर्घटनाग्रस्त कर देगा।

एक तरह से करने के लिए यह, ज़ाहिर है, इस तरह है:

int * badPointer = NULL; 
*badPointer = 666; 

और वह मेरे लिए काम करता है, लेकिन मुझे लगता है कि दृष्टिकोण पसंद नहीं है क्योंकि यह अपरिभाषित व्यवहार पर निर्भर करता है - विशेष रूप से, C++ मानक को क्रैश होने के लिए उपरोक्त कोड की आवश्यकता नहीं है, इसलिए यह संभव है (भाषा-वकील परिप्रेक्ष्य से) कि उपरोक्त कोड निष्पादित होने पर संकलक का कुछ भविष्य संस्करण क्रैश नहीं होगा।

एक अधिक "आधिकारिक" दृष्टिकोण के रूप में, मैं इस कोशिश की:

abort(); 

... जो कार्यक्रम को समाप्त करता है, लेकिन यह विंडोज संरचित अपवाद कि MiniCrashDump हैंडलर से चलाता है का कारण नहीं है, इसलिए कोई .dmp फ़ाइल लिखी जाती है।

मेरा सवाल है, क्या मेरे कार्यक्रम को दुर्घटनाग्रस्त करने के लिए "आधिकारिक अधिकार" है? मैं देखता हूं कि विंडोज एपीआई में एक RaiseException() फ़ंक्शन है जिसे मैं कॉल कर सकता हूं, लेकिन मुझे यकीन नहीं है कि इसके लिए उचित तर्क क्या होना चाहिए। क्या यह जाने का तरीका है, या क्या कुछ और विशिष्ट कॉल है कि मैं उपयोग करने से बेहतर होगा?

+0

स्क्रीन के माध्यम से हथौड़ा। –

+1

आप भारी कार्यान्वयन विशिष्ट कीवर्ड और व्यवहार का उपयोग कर रहे हैं और आप चिंतित हैं कि सी ++ स्पेक इसके बारे में कुछ दिन कह सकता है ?? निश्चित रूप से, RaiseException() आधिकारिक तरीका है। –

+0

@ हंसपैसेंट यह सी ++ स्पेक नहीं है जो मुझे एमएसवीसी ऑप्टिमाइज़र के रूप में बहुत चिंतित करता है, जो कि जीसीसी-स्टाइल दिमागी चाल चलाना शुरू कर सकता है जैसे कि "चूंकि मुझे पता है कि बैड पॉइंटर न्यूल है, और चूंकि एक पूर्ण सूचक का अपरिवर्तनीय व्यवहार अनिश्चित है, मैं कर सकता हूं ऑप्टिमाइज़ करें जो लिखते हैं "... और फिर अचानक मेरा क्रैश बटन अब क्रैश नहीं होता है। :) –

उत्तर

3

यदि आप जानते हैं कि आप विंडोज़ पर चल रहे हैं तो एक पहुंच संकेत का कारण बनने के लिए एक शून्य सूचक को पूरी तरह से ठीक करना ठीक है - विंडोज सी ++ भाषा की तुलना में मजबूत गारंटी प्रदान करता है। सी ++ का कहना है कि एक शून्य सूचक का अपरिवर्तनीय अपरिभाषित व्यवहार है, लेकिन विंडोज इसे एक एक्सेस उल्लंघन के रूप में परिभाषित करता है (जो सी ++ को पूरी तरह से स्वीकार्य है, क्योंकि एक प्रवेश उल्लंघन अपरिभाषित व्यवहार का एक संभावित परिणाम है)।

Managing Virtual Memory से:

Windows NT हर प्रक्रिया के पते अंतरिक्ष में एक रक्षा बनाता है। प्रत्येक प्रक्रिया के ऊपरी और निचले 65,536 बाइट दोनों सिस्टम द्वारा स्थायी रूप से आरक्षित हैं। पता स्थान के इन पदार्थों जाल आवारा संकेत-संकेत दिए गए कि सीमा 00000000 -0000FFFF या 7FFF0000 -7FFFFFFF में स्मृति को संबोधित करने के प्रयास करने के लिए आरक्षित हैं। संयोग से नहीं, इन पतों में निचले चार निबल्स (दाएं दो बाइट) को अनदेखा करके इस सीमा में पॉइंटर्स का पता लगाना आसान है। अनिवार्य रूप से, एक सूचक अमान्य है यदि ऊपरी चार निबल्स 0000 या 7FFF ; अन्य सभी मूल्य वैध पते का प्रतिनिधित्व करते हैं।

स्मृति के प्रथम पृष्ठ हमेशा की तरह, PAGE_NOACCESS के रूप में मैप किया गया है, इसलिए यदि आप पढ़ने के लिए या एक अशक्त सूचक (या के भीतर एक नल पॉइंटर की +/- 64 KB किसी भी सूचक) लिखने के लिए प्रयास करते हैं, तो आप हमेशा बढ़ा देंगे एक प्रवेश उल्लंघन अपवाद।

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

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