2010-07-27 16 views
8

/proc/$ पीआईडी ​​/ मानचित्र पढ़ने पर आपको मैप किए गए मेमोरी क्षेत्र मिलते हैं। क्या इस क्षेत्र में से किसी एक को डंप करने का तरीका है?एक प्रक्रिया की डंप मेमोरी

$ cat /proc/18448/maps 
...[snip]... 
0059e000-005b1000 r-xp 00000000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
005b1000-005b2000 r--p 00012000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
005b2000-005b3000 rw-p 00013000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
...[snip]... 

धन्यवाद

उत्तर

10

नाह! ptrace() पर PTRACE ATTACH पर कॉल करें। फिर /proc/<pid>/mem खोलें, क्षेत्र ऑफ़सेट की तलाश करें, और /proc</pid>/maps में दिए गए क्षेत्र की लंबाई पढ़ें।

यहां program I wrote है जो सी में करता है। यहां module I wrote है जो इसे पायथन (and the ptrace binding) में करता है। खत्म के लिए, program that dumps all regions of a process to files

का आनंद लें!

+0

कूल :) धन्यवाद बहुत – mathk

+0

टिक के लिए धन्यवाद। इस सामान में बहुत अनुभव मिला: पी –

5

आप प्रक्रिया के लिए gdb संलग्न कर सकते हैं तो डंप लंबाई एक्स शब्द इस के साथ स्थान एल पर शुरू की स्मृति क्षेत्र: ।

जब आप अपनी प्रक्रिया शुरू करते हैं तो gdb संलग्न करना सरल है: gdb ./executable तब run। यदि आपको किसी चल रही प्रक्रिया से अटैचमेंट करने की आवश्यकता है, तो gdb शुरू करें gdb attach pid जहां पिड वह प्रक्रिया आईडी है जिसकी आप परवाह है।

+0

धन्यवाद, :) मैंने इसके बारे में सोचा नहीं है – mathk

+1

आप चल रहे प्रक्रिया से संलग्न करने के लिए कमांड लाइन तर्क का उपयोग कर सकते हैं: 'gdb -p '। –

+0

जानना अच्छा है। मैंने दूरस्थ लक्ष्य के लिए गंभीरता से जीडीबी का उपयोग किया है। – nmichaels

4

dd (1) का उपयोग करना:

sudo dd if=/dev/mem bs=1 skip=$((16#0059e000 - 1)) \ 
     count=$((16#005b1000 - 16#0059e000 + 1)) | hexdump -C 
संबंधित मुद्दे