2012-12-10 10 views
7

मैं बाहरी प्रक्रिया की स्मृति को पढ़ने के लिए पाइथन और पायथन पट्रस का उपयोग करने की कोशिश कर रहा हूं। मुझे पूरी तरह से अजगर में काम करने की ज़रूरत है, और मैं लिनक्स में एक प्रक्रिया की स्मृति को पढ़ने और प्रिंट करने की कोशिश कर रहा हूं।मैं लिनक्स में पायथन में किसी प्रक्रिया की स्मृति को कैसे पढ़ सकता हूं?

इसलिए उदाहरण के लिए मैं निम्नलिखित कोड की कोशिश की है, जो मुझे आईओ त्रुटियों दे रही रखता है:

proc_mem = open("/proc/%i/mem" % process.pid, "r") 
print proc_mem.read() 
proc_mem.close() 

ज्यादातर मैं सिर्फ बार-बार एक प्रक्रिया की स्मृति डंप और समय के साथ परिवर्तन देखने के लिए चाहते हैं। यदि ऐसा करने का यह सही तरीका है, तो मेरी समस्या क्या है? या ऐसा करने के लिए एक और उचित तरीका है?

+5

यह उत्तर दिया गया है, विस्तार से, http://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux – larsks

+0

ऐसा लगता है/proc /% i/mem फ़ाइल को पढ़ने की कोशिश वास्तव में जिस तरह से मैं करना चाहता हूं। तो मेरे प्रश्न का दूसरा आधा मुझे लगता है। क्या पाइथन में ऐसा करने का कोई उचित तरीका है, यह मानते हुए कि मैं प्रक्रिया मेमोरी पेज पर लिखना चाहूंगा? मैं प्रक्रिया शुरू करने और रोकने के लिए ptrace का उपयोग कर रहा हूँ। – rvorderm

+0

इस डेमो प्रोग्राम को [लिंक] (http://www.mail-archive.com/[email protected]/msg00011.html) पर दिया गया है: ऐसा लगता है कि मैं जो करने की कोशिश कर रहा हूं उससे काफी निकटता से संबंधित है , हालांकि मैं अभी तक इसे डुप्लिकेट करने में सक्षम नहीं हूं। Ptrace में एक फ़ंक्शन है जो बाइट स्ट्रिंग के लिए मेमोरी मैप के माध्यम से खोज करता है। – rvorderm

उत्तर

3

कॉल अजगर से एक शेल कमांड - उपप्रक्रिया मॉड्यूल

import subprocess 

# ps -ux | grep 1842 (Assuming 1842 is the process id. replace with process id you get) 

p1 = subprocess.Popen(["ps", "-ux"], stdout=subprocess.PIPE) 
p2 = subprocess.Popen(["grep", "1842"], stdin=p1.stdout, stdout=subprocess.PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
print output 

और उत्पादन के माध्यम से पार्स इसकी मेमोरी उपयोग

+1

प्रारूपित आउटपुट पार्सिंग/proc fs का उपयोग करने के रूप में लगभग उतना ही साफ नहीं लगता है - जो वास्तव में इसका उद्देश्य है। – hexparrot

+0

आप सही हैं। लेकिन आवश्यकता के दायरे के आधार पर, एक आदेश को समझना और प्रो फाइल सिस्टम के बारे में समझने के बजाय इसे पार्स करना आसान नहीं है ?? यदि नहीं, तो मुझे लगता है कि इर्स्क द्वारा प्रदान किया गया लिंक इस सवाल का जवाब देता है कि – Sudheer

+0

यह समाप्त हो गया है जो मैं सोच रहा था कि मैं जो सोच रहा था उसके पास आ सकता था। और सबसे महत्वपूर्ण बात यह है कि परियोजना के लिए पर्याप्त मैं काम कर रहा था। – rvorderm

1

ज्यादातर मैं बस चाहता हूँ देखने के बार-बार एक प्रक्रिया की स्मृति डंप करने के लिए और देखने के लिए समय के साथ बदलता है। यदि ऐसा करने का यह सही तरीका है, तो मेरी समस्या क्या है? या ऐसा करने के लिए एक और उचित तरीका है?

आपको gdb के reverse debugging में रुचि हो सकती है, जो स्मृति को संसाधित करने के लिए सभी परिवर्तनों को रिकॉर्ड करता है। यहां the tutorial (google cache) है।

वहाँ भी है Robert O'Callahan के Chronicle/Chronomancerwork, यदि आप कच्चे रिकॉर्डिंग उपकरणों के साथ खेलना चाहता हूँ।

+0

यह भी एक शानदार जवाब था। दरअसल सुधीर के जवाब का उपयोग करके मेरी छोटी परियोजना को समाप्त करने के अलावा वास्तव में यह मेरा स्वीकार्य उत्तर होगा। – rvorderm