ফাইল করার জন্য একটি লিনাক্স প্রক্রিয়ার মেমরি ডাম্প করুন


52

কোনও প্রক্রিয়া (পিআইডি দ্বারা) বরাদ্দ করা বর্তমান মেমোরিটি কোনও ফাইলে ফেলে দেওয়া কি সম্ভব? নাকি একরকম পড়ে?



1
এছাড়াও আপনি পড়তে চাইবেন superuser.com/questions/236390/... পরিবর্তে gcore ব্যবহার করুন।
সাইমন এ। ইউগস্টার

উত্তর:


46

আমি নিশ্চিত নই যে আপনি বারবার এটি না করে আপনি কীভাবে কোনও ফাইলে সমস্ত মেমরি ডাম্প করেন (যদি কেউ এই কাজটি করার জন্য জিডিবি পাওয়ার কোনও স্বয়ংক্রিয় পদ্ধতি জানে তবে দয়া করে আমাকে জানান) তবে আপনার জানা ধরে নিলাম যে কোনও একটি ব্যাচের জন্য নিম্নলিখিতটি কাজ করে পিড:

$ 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

তারপরে স্ট্রিং কমান্ডটি দিয়ে / রুট / আউটপুট বিশ্লেষণ করুন, আপনার স্ক্রিনে আপনি কম বেশি চান।


1
জিডিবি ছাড়াই কেবল বাশ / এস-এ এটি করার কোনও উপায় আছে কি?
প্রোগ্রামিং

3
@ Programming4life gcore (1)
জুলিয়ান

51

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা এই কাজটি সম্পাদন করে।

এই ধারণাটি জেমস লরির উত্তর এবং এই পোস্ট থেকে এসেছে: http://www.linuxforums.org/forum/programming-scriptting/52375-reading-mmory-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

এটি একটি ফাইলে রাখুন (উদাঃ "ডাম্প-সমস্ত- মেমোরি-of-pid.sh") এবং এটি কার্যকর করতে সক্ষম করুন

ব্যবহার: ./dump-all-memory-of-pid.sh [pid]

আউটপুট নাম সহ ফাইলগুলিতে মুদ্রিত হয়: pid-startaddress-stopaddress.dump

নির্ভরতা: gdb


2
অসাধারণ! কোন স্ক্রিপ্টে একটি রহস্যজনক বাশ ইনস্ট্যান্স চলছে তা সন্ধান করার জন্য এটি কেবল ব্যবহার করেছিলেন।
টোবিয়া

আপনি কেন rw-pঅনুমতি সহ কেবলমাত্র গ্রেপিং এবং রেঞ্জগুলি ছাড়ছেন ?
mxMLnkn

@mxmlnkn এই ডেটা ( rw-p), অন্যান্য রেঞ্জগুলি কোড ( r-xp) এর জন্য । যদি আপনি উভয়ের একটি ডাম্প চান, তবে এগিয়ে যান এবং grepউদাহরণস্বরূপ বিনিময় করুন cat
এ। নীলসন

39

চেষ্টা

    gcore $pid

$pidপিডের আসল সংখ্যাটি কোথায় ; আরও তথ্যের জন্য দেখুন:info gcore

ডাম্পটি ঘটতে কিছুটা সময় নিতে পারে এবং কিছু স্মৃতি পড়তে পারা যায় না তবে যথেষ্ট ভাল ... এটিও সচেতন থাকুন যে এটি বড় ফাইল তৈরি করতে পারে, আমি সবেমাত্র একটি 2 জিবি ফাইল তৈরি করেছি ..


1
হয় gcoreএকটি বিক্ষিপ্ত ফাইল ডাম্পিং?
সিএমসিডিগ্রাগনকাই

3

মানুষ proc বলেছেন:

/ proc / [pid] / mem এই ফাইলটি কোনও প্রক্রিয়ার স্মৃতির পৃষ্ঠাগুলি ওপেন (2), পঠন (2) এবং lseek (2) এর মাধ্যমে অ্যাক্সেস করতে ব্যবহৃত হতে পারে।

হতে পারে এটি আপনাকে সাহায্য করতে পারে


1
এটি পর্যাপ্ত নয়, লক্ষ্য প্রক্রিয়াটি ঝুলতে এড়াতে অন্য প্রক্রিয়াটি পড়ার জন্য / proc / <pid> / {মেম, * মানচিত্র}, ptrace এবং কিছু সংকেত হ্যান্ডলিং দরকার।
তোবু


3

আমি পুরো প্রক্রিয়া মেমরিটিও ডাম্প করার জন্য আমার নিজের প্রোগ্রাম তৈরি করেছি, এটি সিতে রয়েছে যাতে এটি অ্যান্ড্রয়েডে ক্রস-সংকলিত করা যায়, যা আমার প্রয়োজন।

আপনি আইপি ঠিকানা এবং টিসিপি পোর্টও নির্দিষ্ট করতে পারেন। উত্স কোড এখানে


2

খাঁটি বাশ সমাধান:

procdump () 
{ 
    cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
    while read a b; do
        count=$(( bd-ad ))
        ad=$(printf "%llu" "0x$a")
        bd=$(printf "%llu" "0x$b")
        dd if=/proc/$1/mem bs=1 skip=$ad count=$count of=$1_mem_$a.bin
    done )
}

ব্যবহার: প্রোকডাম্প পিআইডি

ক্লিনার ডাম্পের জন্য:

procdump () 
{ 
    cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
    while read a b; do
        ad=$(printf "%llu" "0x$a")
        bd=$(printf "%llu" "0x$b")
        dd if=/proc/$1/mem bs=1 skip=$ad count=$(( bd-ad )) of=$1_mem_$a.bin
    done )
}

সুতরাং, আমি যা বুঝি সেগুলি থেকে ক্লিনার ডাম্পের পিছনে ধারণাটি হ'ল কেবল ইন-মেমরি ফাইলগুলি মেমরি অঞ্চলের সাথে প্রকৃত অ্যাপ্লিকেশন মেমরির বিপরীতে মাপযুক্ত থাকে যার আকার 0 থাকে (আকারটি প্রকৃতপক্ষে ব্যবহৃত আকারটি অজানা) অপারেটিং সিস্টেম)।
এমএক্সএমএনএলএনএন

এই স্ক্রিপ্টটির সাথে আমার একটি সমস্যাটি হ'ল 1 এর ব্লকসাইজটি পৃষ্ঠার আকারের সমান ব্লকসাইজ (আমার জন্য 4096) ব্যবহারের তুলনায় অগ্রহণযোগ্য ধীরে 30kB / s ব্যান্ডউইথের দিকে নিয়ে যায় যার জন্য আমি for 100MB / s পাই! এখানে দেখুন । getconf PAGESIZEপৃষ্ঠার আকার পেতে ব্যবহার করা হয় এবং তারপরে ঠিকানা এবং গণনাগুলি এর দ্বারা ভাগ করা হয়।
mxMLnkn

1

প্রক্রিয়াটিকে স্ট্যান্ডার্ড আউটপুট, প্যাক্যাট / মেমডম্প্পে ফেলে দেওয়ার সরঞ্জাম:


এটি একটি অপ্রচলিত (রক্ষণাবেক্ষণকারীর অনুরোধে অপসারণ); আমি যাইহোক পুরানো প্যাকেজটি ইনস্টল করেছি এবং এটি "ইনপুট / আউটপুট ত্রুটি দিয়ে ব্যর্থ হয়েছে; আপনি অন্য মেশিনের শিরোলেখ ফাইলগুলির সাথে জিসিসি ব্যবহার করেছেন?"
টুবু


0

যদি আপনি বিশাল কোর ফাইল তৈরি না করে চলমান প্রক্রিয়াটির একটি পৃথক মেমরি বিভাগকে ডাম্প করতে চান (gcore দিয়ে বলুন), আপনি এখান থেকে একটি ছোট সরঞ্জাম ব্যবহার করতে পারেন । README এ ওয়ান-লাইনারও রয়েছে যদি আপনি সমস্ত পাঠযোগ্য সেগমেন্ট আলাদা আলাদা ফাইলে ডাম্প করতে চান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.