सवाल फ़ाइल करने के लिए एक लिनक्स प्रक्रिया की स्मृति डंप करें


क्या किसी प्रक्रिया (पीआईडी ​​द्वारा) को फ़ाइल में आवंटित वर्तमान मेमोरी को डंप करना संभव है? या इसे किसी भी तरह पढ़ा?


46
2017-08-24 17:44


मूल


आप मेरा उपयोग कर सकते हैं सबूत-ऑफ-अवधारणा स्क्रिप्ट जो पढ़ता है /proc/$pid/mem। - Gilles
आप भी पढ़ना चाहेंगे superuser.com/questions/236390/... और इसके बजाय gcore का उपयोग करें। - Simon A. Eugster


जवाब:


मुझे यकीन नहीं है कि आप बार-बार ऐसा करने के बिना सभी मेमोरी को फ़ाइल में कैसे डंप करते हैं (यदि कोई ऐसा करने के लिए जीडीबी प्राप्त करने के लिए स्वचालित तरीका जानता है तो कृपया मुझे बताएं), लेकिन निम्नलिखित जानते हैं कि स्मृति के किसी भी बैच के लिए आपको यह पता चलता है कि आपको पता है पिड:

$ cat /proc/[pid]/maps

यह प्रारूप में होगा (उदाहरण):

00400000-00421000 r-xp 00000000 08:01 592398                             /usr/libexec/dovecot/pop3-login
00621000-00622000 rw-p 00021000 08:01 592398                             /usr/libexec/dovecot/pop3-login
00622000-0066a000 rw-p 00622000 00:00 0                                  [heap]
3e73200000-3e7321c000 r-xp 00000000 08:01 229378                         /lib64/ld-2.5.so
3e7341b000-3e7341c000 r--p 0001b000 08:01 229378                         /lib64/ld-2.5.so

स्मृति के एक बैच को चुनें (उदाहरण के लिए 00621000-00622000) फिर प्रक्रिया के साथ संलग्न करने के लिए जीडीबी रूट के रूप में उपयोग करें और उस मेमोरी को डंप करें:

$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000

फिर स्ट्रिंग कमांड के साथ / रूट / आउटपुट का विश्लेषण करें, कम से कम आप अपनी स्क्रीन पर पुटी को चाहते हैं।


40
2017-08-24 18:39



क्या gdb के बिना बस bash / sh में ऐसा करने का कोई तरीका है? - Programming4life
@ Programming4life gcore (1) - SYS_V


मैंने एक स्क्रिप्ट बनाई है जो इस कार्य को पूरा करती है।

विचार जेम्स लॉरी के जवाब और इस पोस्ट से आता है: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195

#!/bin/bash

grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done

इसे एक फ़ाइल में रखें (उदाहरण के लिए। "डंप-all-memory-of-pid.sh") और इसे निष्पादन योग्य बनाएं

उपयोग: ./dump-all-memory-of-pid.sh [pid]

आउटपुट को नामों वाली फाइलों पर मुद्रित किया जाता है: pid-startaddress-stopaddress.dump

निर्भरता: gdb


41
2017-07-18 17:38



बहुत बढ़िया! बस यह पता लगाने के लिए इस्तेमाल किया कि कौन सी स्क्रिप्ट एक रहस्यमय बैश उदाहरण चल रहा था। - Tobia


प्रयत्न

    gcore $pid

कहा पे $pid पिड की वास्तविक संख्या है; अधिक जानकारी के लिए देखें: info gcore

डंप होने के लिए कुछ समय लग सकता है, और कुछ मेमोरी पठनीय नहीं हो सकती है, लेकिन यह काफी अच्छी है ... जागरूक रहें कि यह बड़ी फाइलें बना सकता है, मैंने अभी 2 जीबी फाइल बनाई है ..


34
2018-03-09 19:06



है gcore एक स्पैस फ़ाइल डंपिंग? - CMCDragonkai


आदमी proc कहते हैं:

/ Proc / [pid] / मेम                 इस फ़ाइल का उपयोग किसी प्रक्रिया के पृष्ठों तक पहुंचने के लिए किया जा सकता है   खुली (2) के माध्यम से स्मृति, पढ़ें (2), और lseek (2)।

शायद यह आपकी मदद कर सकता है


3
2017-08-24 17:58



यह पर्याप्त नहीं है, किसी अन्य प्रक्रिया को पढ़ने के लिए लक्ष्य प्रक्रिया को लटकने से बचने के लिए / proc / <pid> / {mem, * maps}, ptrace, और कुछ सिग्नल हैंडलिंग के संयोजन की आवश्यकता होती है। - Tobu
@Tobu वास्तव में। मैंने एक लिखा सबूत-ऑफ-अवधारणा स्क्रिप्ट। - Gilles


मैंने पूरी प्रक्रिया मेमोरी को डंप करने के लिए अपना खुद का प्रोग्राम बनाया है, यह सी में है इसलिए इसे एंड्रॉइड में क्रॉस-कंपाइल किया जा सकता है, जो मुझे चाहिए।

आप आईपी पता और टीसीपी पोर्ट भी निर्दिष्ट कर सकते हैं। सोर्स कोड यहाँ


2
2017-12-27 14:55





मानक आउटपुट, पीटीसी / मेमडम्प को प्रक्रिया डंप करने के लिए उपकरण:


1
2018-02-04 21:27



यह अप्रचलित है (रखरखाव के अनुरोध पर हटा दिया गया है); मैंने वैसे भी पुराना पैकेज स्थापित किया है और यह "इनपुट / आउटपुट त्रुटि" के साथ विफल रहा है, क्या आपने किसी अन्य मशीन की हेडर फाइलों के साथ जीसीसी का उपयोग किया था? "। - Tobu


अब आप लिनक्स पर SysInternals सूट से procdump का उपयोग कर सकते हैं:

https://github.com/Microsoft/ProcDump-for-Linux 


0
2017-12-07 07:09