दिलचस्प पोस्ट
कर्ल PHP के साथ फेसबुक उपयोगकर्ता की दीवार पर पोस्ट करें एक INTERNAL_ERROR हुआ जब GoogleSignInOptions से ईमेल अनुरोध Android ReactJS में राज्य सरणियों का सही संशोधन आईफ़िशिंग () को समझना DialogFragment की चौड़ाई और ऊंचाई कैसे सेट करें? जीजीप्लोट 2 में अक्ष लेबल घूर्णन और अंतर करना दृश्य में प्रयुक्त PostgreSQL कॉलम बदलें जावास्क्रिप्ट में "डबल टिल्ड" (~~) ऑपरेटर क्या है? पृष्ठ का एक ताज़ा करने के कारण सबमिट करने से बचने का सर्वोत्तम तरीका jQuery। एक गतिशील रूप से डाला iframe में पहले से ही क्यों शून्य = शून्य एसक्यूएल सर्वर में झूठ का मूल्यांकन करता है विंडोज पर गिट के साथ काम करने के लिए मैं एक संपादक कैसे स्थापित कर सकता हूँ? LINQ के लिए वाइल्डकार्ड खोज UITextView को UITextView के अंदर से कैसे बनाऊं, जो कि यूआईटीक्स्टव्यू के आधार पर गतिशील रूप से अपनी ऊंचाई समायोजित करता है? ViewPager पेजर एडाप्टर दृश्य को अपडेट नहीं कर रहा है

सी में एक स्टैक ट्रेस कैसे पकड़ सकता है?

मुझे पता है कि ऐसा करने के लिए कोई मानक C फ़ंक्शन नहीं है। मैं सोच रहा था कि विंडोज और * नििक्स पर यह तकनीक क्या है? (विंडोज एक्सपी मेरी सबसे महत्वपूर्ण ओएस है इस पर अभी करना है।)

वेब के समाधान से एकत्रित समाधान "सी में एक स्टैक ट्रेस कैसे पकड़ सकता है?"

हमने इसे हमारी परियोजनाओं के लिए उपयोग किया है:

https://www.codeproject.com/kb/threads/stackwalker.aspx

कोड एक टैड गड़बड़ IMHO है, लेकिन यह अच्छी तरह से काम करता है। केवल विंडोज

glibc backtrace () फ़ंक्शन प्रदान करता है

http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

बैकटास (), और बैकटास_सिंबोल ():

मैन पेज से:

  #include <execinfo.h> #include <stdio.h> ... void* callstack[128]; int i, frames = backtrace(callstack, 128); char** strs = backtrace_symbols(callstack, frames); for (i = 0; i < frames; ++i) { printf("%s\n", strs[i]); } free(strs); ... 

एक अधिक सुविधाजनक / ओओपी तरीके से इसका उपयोग करने का एक तरीका बैकट्र्रेस_संबॉल्स () के अपवाद क्लास कन्स्ट्रक्टर में परिणाम सहेजना है। इस प्रकार, जब भी आप उस प्रकार के अपवाद को फेंक देते हैं, आपके पास स्टैक ट्रेस है उसके बाद, इसे प्रिंट करने के लिए केवल एक फ़ंक्शन प्रदान करें। उदाहरण के लिए:

class MyException : public std::exception { char ** strs; MyException( const std::string & message ) { int i, frames = backtrace(callstack, 128); strs = backtrace_symbols(callstack, frames); } void printStackTrace() { for (i = 0; i 


 प्रयत्न {
    माइएक्सेशन फेंक ("ओह!");
 } पकड़ (माइई एक्सप्शन ई) {
     e.printStackTrace ();
 }

टा दा!

नोट: ऑप्टिमाइज़ेशन झंडे को सक्षम करने से परिणामी स्टैक ट्रेस अयोग्य हो सकता है। आदर्श रूप से, एक डिबग फ्लैग और ऑप्टिमाइज़ेशन फ्लैग के साथ इस क्षमता का उपयोग करेगा I

Windows के लिए StackWalk64 () एपीआई (32 बीटा विंडोज पर भी) की जांच करें। यूनिक्स के लिए आपको ओएस के मूल तरीके से इसका उपयोग करना चाहिए, या glibc के बैकस्ट्र्रेस () पर फॉलबैक करना चाहिए, यदि उपलब्ध है।

ध्यान दें कि मूल कोड में एक Stacktrace लेना शायद ही अच्छा विचार है – नहीं, क्योंकि यह संभव नहीं है, लेकिन क्योंकि आप आम तौर पर गलत चीज़ प्राप्त करने की कोशिश कर रहे हैं।

ज्यादातर समय लोग एक असाधारण परिस्थिति में एक स्टैकट्र्रेस प्राप्त करने का प्रयास करते हैं, जैसे एक अपवाद पकड़ा जाता है, एक जोर विफल हो जाता है या – उनमें से सबसे खराब और सबसे ग़लत – जब आपको घातक "अपवाद" मिलता है या कोई संकेत विभाजन उल्लंघन

पिछले अंक को देखते हुए, अधिकांश एपीआई आपको स्पष्ट रूप से स्मृति आवंटित करने की आवश्यकता होगी या आंतरिक रूप से ऐसा कर सकते हैं। ऐसा नाजुक स्थिति में करना, जिसमें आपका कार्यक्रम वर्तमान में हो सकता है, वह कुछ भी चीजें और भी बदतर बना सकती है उदाहरण के लिए, क्रैश रिपोर्ट (या coredump) समस्या के वास्तविक कारण को प्रतिबिंबित नहीं करेगा, लेकिन इसे संभाल करने में आपका असफल प्रयास)।

मुझे लगता है कि आप उस घातक-त्रुटि-संभालने वाली चीज़ को प्राप्त करने की कोशिश कर रहे हैं, क्योंकि अधिकांश लोग यह कोशिश करते हैं कि जब यह स्टैकट्र्रेस प्राप्त करने के लिए आता है। यदि हां, तो मैं डिबगर (विकास के दौरान) पर निर्भर रहूँगा और उत्पादन में प्रोसेसिंग कॉरोडप (या विंडो पर मिनी-डंप) देगी। एक साथ उचित प्रतीकों-प्रबंधन के साथ, आपके पास पोस्टमार्टम के कारण अनुदेश के बारे में कोई समस्या नहीं है।

विंडोज के लिए, CaptureStackBackTrace() एक विकल्प भी है, जिसे StackWalk64() तुलना में उपयोगकर्ता के अंत पर कम तैयारी कोड की आवश्यकता होती है। (इसके अलावा, एक समान परिदृश्य के लिए, StackWalk64() तुलना में बेहतर काम किया (अधिक विश्वसनीय StackWalk64()

आपको खोलना पुस्तकालय का उपयोग करना चाहिए

 unw_cursor_t cursor; unw_context_t uc; unw_word_t ip, sp; unw_getcontext(&uc); unw_init_local(&cursor, &uc); unsigned long a[100]; int ctr = 0; while (unw_step(&cursor) > 0) { unw_get_reg(&cursor, UNW_REG_IP, &ip); unw_get_reg(&cursor, UNW_REG_SP, &sp); if (ctr >= 10) break; a[ctr++] = ip; } 

जब तक आप साझा लाइब्रेरी से कॉल नहीं करते हैं, तब भी आपका दृष्टिकोण ठीक काम करेगा।

आप संबंधित पीसी के स्रोत फ़ंक्शन / लाइन नंबर प्राप्त करने के लिए लिनक्स पर addr2line कमांड का उपयोग कर सकते हैं।

ऐसा करने के लिए कोई प्लेटफ़ॉर्म स्वतंत्र नहीं है

निकटतम चीज जो आप कर सकते हैं वह अनुकूलन के बिना कोड को चलाने के लिए है। इस तरह आप प्रक्रिया से जुड़ा कर सकते हैं (विज़ुअल सी + डीबगर या जीडीबी का उपयोग करके) और एक उपयोगी स्टैक ट्रेस प्राप्त करें

मैं आपको अपने लेख में बता सकता हूं यह कोड की कुछ ही पंक्तियाँ हैं

पोस्ट मॉर्टम डिबगिंग

यद्यपि मेरे पास वर्तमान में इस के x64 कार्यान्वयन के साथ समस्याएं हैं I

सोलारिस में pstack कमांड है, जिसे लिनक्स में भी कॉपी किया गया था।

आप स्टैक पर पीछे की ओर चलकर इसे कर सकते हैं हकीकत में, हालांकि, प्रत्येक समारोह की शुरुआत में एक कॉल स्टैक पर एक पहचानकर्ता को जोड़ना और अंत में इसे पॉप करना आसान होता है, फिर बस उस सामग्री को मुद्रित करते रहें यह एक पिटा का एक सा है, लेकिन यह अच्छी तरह से काम करता है और आपको अंत में समय बचाएगा।