2011-12-05 8 views
7

क्या रूबी 1.9.एक्स प्रक्रिया के रनटाइम स्टैक ट्रेस को मुद्रित करने का कोई तरीका है? मुझे पता है कि रुबी 1.8 के लिए pstack नामक एक उपयोगिता थी, लेकिन प्रोजेक्ट को कुछ साल पहले छोड़ दिया गया प्रतीत होता है: https://github.com/ice799/pstack। क्या रूबी 1.9 के लिए ऐसा कुछ भी मौजूद है? आपका बहुत बहुत धन्यवाद!मैं रुबी 1.9 प्रक्रिया के रनटाइम स्टैक ट्रेस को कैसे प्रिंट कर सकता हूं?

संपादित करें: मुझे स्टैक ट्रेस उत्पन्न करने के लिए बाहरी उपकरण का उपयोग करने में रूचि है (रूबी प्रक्रिया के समान स्मृति स्थान में नहीं चल रहा है)।

जैसा कि @mosch ने बताया, Kernal#caller विधि चल रही रूबी प्रक्रिया के भीतर से कार्य करती है।

तुम भी अपने रूबी कोड है कि इस प्रक्रिया का संकेत फंसा लेती है और एक स्टैक ट्रेस प्रिंट करने के लिए समर्थन में बना सकते हैं:

Signal.trap("SIGTERM") { p caller } 

संदर्भ: http://www.ruby-doc.org/core-1.9.3/Signal.html

मैं अपने कोड में इस कार्यक्षमता का निर्माण सकता है, लेकिन मैं डी अधिक सामान्यीकृत, बाहरी समाधान का उपयोग करना पसंद करते हैं। धन्यवाद।

उत्तर

3

जब भी आप कर्नेल विधि caller पर कॉल करते हैं, तो आपको वर्तमान कॉल स्टैक को ऐरे के रूप में मिल जाएगा।

+0

धन्यवाद @mosch। मैंने कुछ स्पष्टीकरण जोड़ने के लिए अपना विवरण अपडेट कर लिया है। –

0

मैं आज इस पर एक विचार के साथ आया था। Ice799 से पस्टैक ने जीडीबी का लाभ उठाया ताकि बैकट्रैस को डंप करने के लिए रूबी आंतरिक फ़ंक्शन को कॉल किया जा सके। हालांकि, यह 1.9 के लिए काम नहीं किया और एक पैच की आवश्यकता है। यह इतना सुविधाजनक नहीं है।

भाग्य के साथ, हमारे पास hotpatch इस शक्तिशाली उपकरण है। यह एक चलती प्रक्रिया के लिए .so इंजेक्ट कर सकता है, हम .so इंजेक्शन के माध्यम से आवश्यक फ़ंक्शन जोड़ सकते हैं, pstack बाकी सब कुछ कर देगा। बेशक इंजेक्शन। इसलिए चलने वाले रूबी कोर के साथ बाइनरी संगत होना चाहिए, लेकिन हम मान सकते हैं कि यह हिस्सा अब बहुत स्थिर है।

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

  • कोई संबंधित समस्या नहीं^_^