2012-09-05 13 views
7

द्वारा अपवादित करने के लिए सी ++ फेंकने का कारण कैसे बनें यदि फेंकने वाले अपवाद को एक निश्चित पकड़ से संभाला जाता है तो फेंक साइट पर कोर को डंप करने का कोई तरीका है ब्लॉक? जब मैं अपवाद शीर्ष स्तर तक पहुंच जाता हूं तो मुझे जी ++ के साथ क्या होता है जैसा कुछ पसंद है। ,अपवाद को किसी विशेष पकड़ ब्लॉक

try { 
    bar(); 
    try { 
    foo(); 
    } catch(...) { 
# pragma dump_at_throw_site 
    } 
} catch(...) { 
    std::cerr << "There was a problem" << std::endl; 
} 

इस तरह अगर() किसी भी अपवाद foo से फेंका या उसके कॉल प्राप्त करने वाला का कि foo (की कॉल-साइट तक पहुँच जाता है) एक कोर डंप का कारण होगा:

उदाहरण के लिए, मैं कुछ इस तरह चाहते हैं फेंक साइट पर ताकि कोई यह देख सके कि अपवाद किसने किया है जो इसे इस स्तर तक पहुंचाता है।

दूसरी तरफ, बार() द्वारा फेंकने वाले अपवादों को सामान्य रूप से संभाला जाएगा।

+1

मुझे लगता है कि सामान्य तरीका इसे पकड़ने के लिए नहीं है, और उम्मीद है कि संकलक/पर्यावरण आपके लिए डंप करता है। 'फेंक' अभिव्यक्ति के बाद फेंक साइट के बारे में जानकारी _instant_ खो गई है। –

+0

ठीक है, यही कारण है कि मैं कोर डंप के लिए तर्क उत्पन्न करने के लिए संकलक को बताना चाहता हूं ताकि ढेर अवांछित न हो। यह संभव है क्योंकि यह वही होता है जब कॉल श्रृंखला की जड़ तक * कोई * पकड़ ब्लॉक नहीं होता है। हालांकि, बाहरी पकड़ ब्लॉक हैं जो मेरे मामले में अपवाद को पकड़ेंगे। मैं विशेष रूप से फू() के लिए फेंक साइट पर कोर को डंप करना चाहता हूं, उदाहरण के रूप में, और बार से अपवादों को अनदेखा करता हूं। मैं एक clang ++ या g ++ विशिष्ट उत्तर के साथ रह सकता हूं। – Manish

+1

उस स्थिति में, _throw साइट_ को कोर डंप उत्पन्न करना है, कैश नहीं। हालांकि, एक विकल्प कुछ आंतरिक संरचना में कोर डंप उत्पन्न करना है, उस जानकारी को अपवाद में सहेजें, और _then_ अपवाद फेंक दें। _Then_ कैचकी उस डंप जानकारी के साथ कुछ कर सकती है। –

उत्तर

2

हाँ, यह विंडोज़ में हो सकता है। मुझे लिनक्स नहीं पता, मान लीजिए कि यह भी हो सकता है।

हम जवाबी कार्रवाई के लिए एक अपवाद संचालक समारोह रजिस्टर कर सकते हैं throwcatch यहाँ से पहले कोड उदाहरण है:

#include <iostream> 
#include "windows.h" 
#define CALL_FIRST 1 
LONG WINAPI 
VectoredHandler(
    struct _EXCEPTION_POINTERS *ExceptionInfo 
    ) 
{ 
    UNREFERENCED_PARAMETER(ExceptionInfo); 
    std::cout <<"VectoredHandler"<<std::endl; 
    return EXCEPTION_CONTINUE_SEARCH; 
} 
int main() 
{ 
    PVOID handler; 
    handler = AddVectoredExceptionHandler(CALL_FIRST,VectoredHandler); 

    try { 
     throw 1; 
    }catch(...) 
    { 
     std::cout <<"catch (...)"<< std::endl; 
    } 

    RemoveVectoredExceptionHandler(handler); 
    std::cout << "end of main"<<std::endl; 
    return 0; 
} 

कोड के आउटपुट हैं:

VectoredHandler 
catch (...) 
end of main 

तो, आप डंप कर सकते हैं कोर int फंक्शन VectoredHandlerVectoredHandler को डीबगर को पहली मौका अधिसूचना मिलने के बाद बुलाया जाता है, लेकिन इससे पहले कि सिस्टम ढेर को अनदेखा करना शुरू कर देता है। और यदि आपका उद्देश्य समस्या समस्या को डीबग करने के लिए है, तो आप पहले अवसर अपवाद को संभालने के लिए डीबगर सुविधा पर भरोसा कर सकते हैं, एप्लिकेशन को डंप करने की आवश्यकता नहीं है।

आपकी जानकारी के लिए, आपको विंडोज़ में What is a First Chance Exception? पता होना चाहिए कि विंडोज़ अपवाद को कैसे प्रेषित करता है।

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