मैं एक पुस्तकालय लिख रहा हूं जिसे मैं पोर्टेबल बनाना चाहता हूं। इस प्रकार, यह glibc या Microsoft एक्सटेंशन या किसी अन्य चीज पर निर्भर नहीं होना चाहिए जो मानक में नहीं है। मेरे पास std :: अपवाद से व्युत्पन्न कक्षाओं का एक अच्छा पदानुक्रम है जिसका उपयोग मैं तर्क और इनपुट में त्रुटियों को संभालने के लिए करता हूं। यह जानकर कि किसी विशेष प्रकार के अपवाद को किसी विशेष फ़ाइल पर फेंक दिया गया था और लाइन नंबर उपयोगी है, लेकिन यह जानकर कि निष्पादन कैसे प्राप्त हुआ, वहां संभावित रूप से अधिक मूल्यवान होगा, इसलिए मैं स्टैक ट्रेस प्राप्त करने के तरीकों को देख रहा हूं।पोर्टेबल सी ++ अपवाद पर स्टैक ट्रेस
मुझे पता है कि इस डेटा को execinfo.h में कार्यों का उपयोग कर (question 76822 देखें) और माइक्रोसॉफ्ट के सी में StackWalk इंटरफेस के माध्यम से ++ कार्यान्वयन (question 126450 देखें) glibc के खिलाफ निर्माण उपलब्ध है हूँ, लेकिन मैं बहुत ज्यादा कुछ भी से बचने के लिए चाहते हैं वह पोर्टेबल नहीं है।
मैं इस रूप में इस कार्यक्षमता अपने आप को लागू करने की सोच रहा था:
class myException : public std::exception
{
public:
...
void AddCall(std::string s)
{ m_vCallStack.push_back(s); }
std::string ToStr() const
{
std::string l_sRet = "";
...
l_sRet += "Call stack:\n";
for(int i = 0; i < m_vCallStack.size(); i++)
l_sRet += " " + m_vCallStack[i] + "\n";
...
return l_sRet;
}
private:
...
std::vector<std::string> m_vCallStack;
};
ret_type some_function(param_1, param_2, param_3)
{
try
{
...
}
catch(myException e)
{
e.AddCall("some_function(" + param_1 + ", " + param_2 + ", " + param_3 + ")");
throw e;
}
}
int main(int argc, char * argv[])
{
try
{
...
}
catch (myException e)
{
std::cerr << "Caught exception: \n" << e.ToStr();
return 1;
}
return 0;
}
यह एक भयानक विचार है? इसका मतलब यह होगा कि प्रत्येक कार्य में कोशिश/पकड़ ब्लॉक जोड़ने के बहुत सारे काम हैं, लेकिन मैं इसके साथ रह सकता हूं। यह तब काम नहीं करेगा जब अपवाद का कारण स्मृति भ्रष्टाचार या स्मृति की कमी है, लेकिन उस बिंदु पर आप वैसे भी बहुत खराब हो जाते हैं। यह भ्रामक जानकारी प्रदान कर सकता है अगर स्टैक में कुछ फ़ंक्शंस अपवाद नहीं लेते हैं, खुद को सूची में जोड़ते हैं, और फिर से प्रयास करते हैं, लेकिन मैं कम से कम गारंटी प्रदान कर सकता हूं कि मेरे सभी लाइब्रेरी फ़ंक्शन ऐसा करते हैं। एक "असली" स्टैक ट्रेस के विपरीत मुझे कॉलिंग फ़ंक्शंस में लाइन नंबर नहीं मिलेगा, लेकिन कम से कम मेरे पास कुछ होगा।
मेरी प्राथमिक चिंता यह संभावना है कि इससे कोई अपवाद नहीं होने पर भी मंदी का कारण बन जाएगा। क्या इन सभी प्रयास/पकड़ ब्लॉक को प्रत्येक फ़ंक्शन आमंत्रण पर अतिरिक्त सेट-अप और आंसू-डाउन की आवश्यकता होती है, या किसी भी तरह संकलन-समय पर संभाला जाता है? या क्या ऐसे अन्य मुद्दे हैं जिन पर मैंने विचार नहीं किया है?
एक और परिप्रेक्ष्य के लिए हर्ब सटर के http://www.gotw.ca/gotw/047.htm देखें। – AJG85