मुझे पता है कि मैं बैकट्रैस() या [एनएसटीएचड कॉलस्टैकसिंबल्स] का उपयोग कर वर्तमान धागे का स्टैक ट्रेस प्राप्त कर सकता हूं, लेकिन मैं एक अलग धागे के स्टैक ट्रेस पर कैसे पहुंचूंगा (माना जाता है कि यह जमे हुए है)?किसी अन्य धागे से एक स्टैक ट्रेस प्रिंट करना
उत्तर
संपादित करें: मेरा मूल उत्तर मनमाने ढंग से धागे से प्रिंट नहीं होगा। मैं के बाद से मेरी दुर्घटना हैंडलर परियोजना में एक उचित कार्यान्वयन लिखा है: https://github.com/kstenerud/KSCrash
विशेष रूप से, इन फ़ाइलों:
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSBacktrace.h
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSBacktrace.c
से कुछ मदद के साथ:
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSMach.h
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSMach.c
तुम क्या है:
- एक नई मशीन संदर्भ संरचना (_STRUCT_MCONTEXT)
- thread_get_state का उपयोग कर अपने ढेर राज्य में भरें बनाओ()
- कार्यक्रम काउंटर जाओ (पहला स्टैक ट्रेस एंट्री) और फ्रेम पॉइंटर (बाकी सभी)
- फ्रेम पॉइंटर द्वारा इंगित स्टैक फ्रेम के माध्यम से चरण और सभी निर्देशों को स्टोर करें बाद में उपयोग के लिए एक बफर में ddresses।
ध्यान दें कि आपको ऐसा करने से पहले धागे को रोकना चाहिए या अन्यथा आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं।
स्टैक फ्रेम संरचनाओं दो संकेत युक्त से भर जाता है: स्टैक पर अगले स्तर तक के
- सूचक
- अनुदेश पता
तो आपको लगता है कि लेने के लिए खाते जब में की जरूरत है अपने स्टैक ट्रेस को भरने के लिए फ्रेम चलना। एक दूषित ढेर की भी संभावना है, जिससे एक खराब सूचक होता है, जो आपके कार्यक्रम को दुर्घटनाग्रस्त कर देगा। आप vm_read_overwrite() का उपयोग कर स्मृति की प्रतिलिपि बनाकर इसे प्राप्त कर सकते हैं, जो पहले कर्नेल से पूछता है कि अगर इसमें स्मृति तक पहुंच है, तो यह क्रैश नहीं होता है।
एक बार आपके पास स्टैक ट्रेस होने के बाद, आप सामान्य पर बैकट्रैस() को कॉल कर सकते हैं (क्रैश हैंडलर को एसिंक-सुरक्षित होना चाहिए, इसलिए यह अपनी बैकट्रैक विधि लागू करता है, लेकिन सामान्य मामलों में बैकट्रैक() ठीक है) ।
कॉलस्टैक को किसी अन्य थ्रेड से प्राप्त करने का कुछ सुरक्षित तरीका यहां दिया गया है: Implementation और some background information। यह सिग्नल हैंडलिंग का उपयोग करता है और लक्ष्य थ्रेड में सिग्नल हैंडलर स्पॉन्स करता है। यह भी लाभ है कि यह आपके समाधान की तुलना में अधिक क्रॉस-प्लेटफॉर्म है, यानी इसे कहीं भी काम करना चाहिए जहां आपके पास <signal.h>
और <execinfo.h>
है।
प्रिंटिंग के लिए, आप backtrace_symbols
का उपयोग अपने स्वयं के सुझाव में कर सकते हैं। लेकिन आप इसे here लागू किए गए विस्तारित संस्करण में रुचि रखते हैं।यह libbfd का उपयोग करता है (binutils से; हालिया संस्करण मैकॉक्स पर भी काम करता है, here को एक छोटी सी सीमा के लिए देखें जो आपके लिए प्रासंगिक नहीं हो सकता है) डीबगिंग जानकारी पढ़ने और लाइन-नंबर और अन्य जानकारी जोड़ने के लिए (यह भी वापस आ जाता है dladdr
यदि सब कुछ विफल हो जाता है, तो backtrace_symbols
क्या कर रहा है)।
- 1. सी ++ (एमएसवीसी) में स्टैक ट्रेस प्रिंट करना?
- 2. अपवाद के स्टैक ट्रेस को प्रिंट करें
- 3. धागे के स्टैक ट्रेस कैसे प्राप्त करें
- 4. प्रिंट पायथन स्टैक ट्रेस उठाए बिना अपवाद
- 5. मैं ग्रोवी स्टैक ट्रेस कैसे प्रिंट करूं?
- 6. आउटपुट विंडो में प्रिंट स्टैक ट्रेस
- 7. स्टैक ट्रेस
- 8. स्टैक ट्रेस
- 9. जावास्क्रिप्ट स्टैक ट्रेस से जावा वास्तविक स्टैक ट्रेस ढूंढना
- 10. स्टैक ट्रेस
- 11. स्टैक ट्रेस
- 12. "स्टैक ट्रेस
- 13. किसी अन्य धागे से अद्यतन लेबल
- 14. किसी अन्य धागे से मुख्य धागे पर रन विधि
- 15. NullPointerException स्टैक ट्रेस डीबग एजेंट
- 16. जावास्क्रिप्ट अपवाद स्टैक ट्रेस
- 17. सिग्नल हैंडलर से प्रिंटिंग स्टैक ट्रेस
- 18. किसी अन्य धागे से मुख्य धागे में कोड चलाना
- 19. "यह" पॉइंटर स्टैक ट्रेस
- 20. स्टैक ट्रेस 3
- 21. स्टैक ट्रेस लिखें जब किसी अन्य थ्रेड से अपवाद फेंक दिया जाता है
- 22. ऑब्जेक्टिव-सी स्टैक ट्रेस
- 23. BuildException/ExitStatusException स्टैक ट्रेस
- 24. सी # स्टैक ट्रेस
- 25. एक्सकोड - जोर से स्टैक ट्रेस कॉल करें?
- 26. स्टैक ट्रेस त्रुटि
- 27. एक स्टैक ट्रेस को एक स्ट्रिंग में बदलें?
- 28. आईओएस वेबकिट क्रैश स्टैक ट्रेस
- 29. फिर से उठाते हैं और स्टैक ट्रेस
- 30. आईसीएस पर मूल स्टैक ट्रेस?
ध्यान दें कि जब आप अपना स्टैक पढ़ रहे हों तो आपको थ्रेड को निलंबित करना चाहिए। – Albert
इसके अलावा, क्या आप वाकई यह काम करते हैं? यह '__builtin_frame_address' का उपयोग करता है जो हमेशा ** वर्तमान ** थ्रेड के बारे में होता है। – Albert
तो यह पता चला है कि यह वास्तव में काम नहीं करता है (यह एक स्टैक ट्रेस प्रिंट करता है, लेकिन मुझे नहीं पता था कि यह वर्तमान धागे से प्रिंट कर रहा था)। मेरे पास कुछ नया कोड है जो इरादे से काम करता है, लेकिन यह अभी तक रिलीज के लिए तैयार नहीं है। एक बार तैयार होने के बाद मैं एक अद्यतन पोस्ट करूंगा। – Karl