2012-10-02 10 views
8

मैं वर्तमान में कुछ अजीब अपवाद है कि सबसे शायद कारण मुझे कुछ opencv के साथ बातचीत को गलत तरीके से, जबकि करने के लिए कर रहे हैं से पीड़ित हूँ:,"सीवी :: स्मृति स्थान पर अपवाद" का कारण क्या है इसका पता लगाने के लिए?

First-chance exception at 0x7580b9bc in xxx.exe: Microsoft C++ exception: cv::Exception at memory location 0x00c1c624..

मैं पहले से ही Debug -> Exceptions मेनू में Thrown क्षेत्र सक्रिय कर दिया है लेकिन मैं वास्तव में यह पता नहीं लगा सकता कि मेरे कोड में अपवाद फेंक दिया गया है।

मैं यह कैसे डीबग कर सकते हैं?

संपादित स्टैक फ्रेम इस तरह पढ़ता है (मेरे ऐप भी सूची में नहीं दिखाया जाएगा!):

  • KernelBase.dll 7580b8bc()
  • [फ्रेम्स नीचे हो सकता है! गलत या गुम]
  • KernelBase.dll! 7580b8bc()
  • opencv_core242d.dll! 54eb60cc()
+0

क्या आपने डीबगर के साथ कदम रखा है और देखा है कि कौन सी रेखा अपवाद का कारण बनती है ?? –

+0

@ टोनी थीलियन मुझे ऐसा करना अच्छा लगेगा, लेकिन दुर्भाग्यवश मुझे यह भी नहीं पता कि मेरे कोड में अपवाद फेंक दिया गया है। मैं देख सकता हूं कि Disassembly है। – memyself

+0

क्या अपवाद वास्तव में आपके प्रोग्राम को समाप्त करता है या इसे संभाला जाता है? – Benj

उत्तर

10

आप अपने पूरे मुख्य को एक कोशिश पकड़ ब्लॉक में लपेट सकते हैं जो अपवाद विवरण प्रिंट करता है। खुला सीवी एपीआई अपवाद फेंक कर सकते हैं, तो आप उन्हें अपने डिजाइन के हिस्से के रूप में वैसे भी से निपटने के बारे में सोचने की आवश्यकता होगी:

try 
{ 
    // ... Contents of your main 
} 
catch (cv::Exception & e) 
{ 
cerr << e.msg << endl; // output exception message 
} 
+2

यह एक शुरुआत है! मुझे 'e.msg()' के बजाय 'e.what()' का उपयोग करना पड़ा। अब मुझे कम से कम opencv त्रुटि मिलती है, लेकिन फिर भी मुझे नहीं पता कि मेरे प्रोग्राम में यह त्रुटि कहां है। क्या इसका पता लगाने का कोई तरीका है? – memyself

+0

@memyself आप डीबगर में कदम से बाहर निकलने तक इसे समझने में सक्षम होना चाहिए जब तक आप अचानक पकड़ ब्लॉक में समाप्त नहीं हो जाते। एक बार ऐसा होता है जो आपके ओपन सीवी फ़ंक्शन पर बारीकी से दिखता है जिसे आपके कोड से बुलाया गया था। – Benj

+0

समस्या यह है कि प्रोग्राम यादृच्छिक रूप से होता है, और केवल तभी उपयोगकर्ता माउस के साथ कुछ करता है। तो जब तक त्रुटि उत्पन्न होती है तब तक इसके माध्यम से कदम उठाना काफी विस्तृत है। मैं सोच रहा था कि एक बार डीबगर 'पकड़' ब्लॉक में है, या यह संभव नहीं है, तो मुझे लाइन नंबर देने का एक तरीका होना चाहिए? – memyself

2

मैं वेब कैमरा के साथ OpenCV का उपयोग करके इस समस्या को मिला है। मेरे मामले में समस्या यह है कि जब प्रोग्राम शुरू नहीं हुआ है तो प्रोग्राम एक छवि को पढ़ने की कोशिश कर रहा है।

मेरी त्रुटि कोड:

// open camera 
capture.open(0); 
while (1){ 
    //store image to matrix // here is the bug 
    capture.read(cameraFeed); 

समाधान

// open camera 
capture.open(0); 
while (1){ 

    //this line makes the program wait for an image 
    while (!capture.read(cameraFeed)); 

    //store image to matrix 
    capture.read(cameraFeed); 

(मेरी अंग्रेजी के बारे में खेद) धन्यवाद

1

OpenCV इस आसान समारोह cv::setBreakOnError

यदि आप डाल कहा जाता है किसी भी से पहले अपने मुख्य में निम्नलिखित opencv कॉल:

cv::setBreakOnError(true); 

तो अपने कार्यक्रम, दुर्घटना होगा बस से पहले ही सीवी :: अपवाद सामान्य रूप से फेंक क्योंकि OpenCV गलत आपरेशन (एक अशक्त सूचक dereferencing) करेंगे। यदि आप डीबगर में अपना कोड चलाते हैं, तो यह इस अवैध ऑपरेशन पर रुक जाएगा, और आप त्रुटि के समय अपने सभी कोड और चर के साथ संपूर्ण कॉल स्टैक देख सकते हैं।

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

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