लिनक्स पर नॉन-ब्लॉकिंग कोर डंप?


24

मैं लिनक्स पर चल रही प्रक्रिया के गैर-घुसपैठ वाले coredump को लेने का एक तरीका ढूंढ रहा हूं।

मैं gdb से परिचित हूं gcore, लेकिन यह केवल तभी चलाया जा सकता है जब gdbप्रक्रिया से जुड़ा हो और यह डिबगिंग के लिए बंद हो। एक बड़े कोर डंप के लिए, जिसका अर्थ है कई सेकंड, या कुछ मिनट भी, बाधित निष्पादन के लिए।

क्या कोई गैर-अवरुद्ध विकल्प है?

लिनक्स कॉपी-ऑन-राइट मेमोरी का समर्थन करता है, जो इसे fork()बिना समर्थन के लिए निर्भर करता है exec()। इसलिए मैं कुछ कर्नेल-स्तर के बारे में सोच रहा हूं जहां कर्नेल प्रक्रिया के टेबल पेज की कॉपी-ऑन-राइट स्नैपशॉट लेता है, जिसे डंप किया जा रहा है, तब कोर लिखते हैं जबकि मूल प्रक्रिया चलती रहती है।

मुझे पूरा यकीन है कि मैं तब बच्चे को डंप gdbकरने के लिए उपयोग कर सकता fork()था, जबकि माता-पिता खुशी से ले जाते हैं, फिर wait()माता-पिता में समाप्ति के बाद बच्चे को वापस लेने के लिए। यह गन्दा है, हालाँकि, और अभी भी मूल प्रक्रिया के दो व्यवधानों की आवश्यकता है, भले ही यह संक्षिप्त हो।

इससे पहले निश्चित रूप से किसी की जरूरत है?


मुझे खेद है कि मैं इस अद्भुत प्रश्न के लिए केवल एक ही उत्थान दे सकता हूं।
पीटर का कहना है कि मोनिका

उत्कृष्ट प्रश्न और मैं, एक के लिए, उत्तर की प्रतीक्षा कर रहा हूं। मेरे से +1
थानिसिस्क

1
1 के बारे में क्या है) gdb 2 के साथ प्रक्रिया को संलग्न करना) इसे "कॉल फोर्क" कमांड 3 द्वारा फोर्क किया जाए, चाइल्ड प्रोसेस 4 के कोर को डंपिंग करते हुए) 4) मृत बच्चे को माता-पिता द्वारा प्रतीक्षा की जाए (दूसरा "कॉल प्रतीक्षा 4") 5 ) प्रक्रिया 6 से अलग) 1-5 को स्वचालित करें? Gdb सरल sys_ptrace () सिस्टम कॉल का उपयोग करता है, यह वास्तव में एक जटिल सी उपकरण नहीं हो सकता है जो gdb से पूरी तरह से स्वतंत्र हो।
पीटर ने कहा कि मोनिका

1
एक वर्चुअल मशीन पर आप एक स्नैपशॉट ले सकते हैं और विश्लेषण के लिए क्लोन के रूप में ला सकते हैं। शायद यहां सूचीबद्ध उपकरण में से एक आपकी मदद करेगा: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni

1
बच्चे की प्रक्रिया भी कांटा और फिर बाहर निकलने से आप दूसरी रुकावट से बच सकते हैं। फिर माता-पिता प्रक्रिया तुरंत बच्चे के लिए इंतजार कर सकते हैं और फिर जारी रख सकते हैं, जबकि दादा दादी कोर।
कैसपर्ड

जवाबों:


1

Google CoreDumper स्प्रिंग्स को मन करता है। यह प्रक्रिया के पता स्थान की एक कॉपी-ऑन-राइट कॉपी बनाता है, WriteCoreDump () ("नोट्स" देखें)।


यह बहुत उपयोगी लग रहा है! मुझे आश्चर्य है कि अंतर्निहित तकनीक का उपयोग क्या है। संभवत: यह प्रक्रिया को रोक देता है, लेकिन सीओडब्ल्यू स्नैपशॉट का निर्माण बिना फोर्किंग के और एक तरह से जो स्टैक को प्रभावित नहीं करता है, चुनौतीपूर्ण होगा। मुझे कोड देखना पड़ेगा। महान टिप।
क्रेग रिंगर

ऐसा लगता है कि यह केवल-प्रक्रिया में है, दुर्भाग्य से, और इसे gdb या समान के माध्यम से लागू नहीं किया जा सकता क्योंकि इसके लिए अपने स्वयं के ptrace की आवश्यकता होती है। इसलिए यह विंडोज के नीचे डीबगेल्प डीएलएल की तरह एक सा है, बजाय एक गैर-ब्लॉकिंग गॉर्क की तरह, लेकिन अभी भी बहुत आसान लग रही है। मुझे लगता है कि यह LD_PRELOAD हुक और gdb के साथ सिग्नल हैंडलर के सेटअप और प्रक्रिया के संकेत के माध्यम से उपयोग करना संभव होगा, लेकिन ऐसा नहीं लगता है कि यह वास्तव में अनमॉडिफाइड प्रोग्राम को डंप करने के लिए डिज़ाइन किया गया है, और इसमें मुद्दा साझा है किसी भी इन-प्रोसेस डंप टूल द्वारा कि अगर प्रक्रिया गड़बड़ है तो डंप काम नहीं करेगा।
क्रेग रिंगर

क्षमा करें ... जब मैंने पहली बार प्रश्न पढ़ा, तो मैं "गैर-घुसपैठ" बिट से चूक गया।
एरिकएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.