কোনও প্রক্রিয়া (পিআইডি দ্বারা) বরাদ্দ করা বর্তমান মেমোরিটি কোনও ফাইলে ফেলে দেওয়া কি সম্ভব? নাকি একরকম পড়ে?
কোনও প্রক্রিয়া (পিআইডি দ্বারা) বরাদ্দ করা বর্তমান মেমোরিটি কোনও ফাইলে ফেলে দেওয়া কি সম্ভব? নাকি একরকম পড়ে?
উত্তর:
আমি নিশ্চিত নই যে আপনি বারবার এটি না করে আপনি কীভাবে কোনও ফাইলে সমস্ত মেমরি ডাম্প করেন (যদি কেউ এই কাজটি করার জন্য জিডিবি পাওয়ার কোনও স্বয়ংক্রিয় পদ্ধতি জানে তবে দয়া করে আমাকে জানান) তবে আপনার জানা ধরে নিলাম যে কোনও একটি ব্যাচের জন্য নিম্নলিখিতটি কাজ করে পিড:
$ 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
তারপরে স্ট্রিং কমান্ডটি দিয়ে / রুট / আউটপুট বিশ্লেষণ করুন, আপনার স্ক্রিনে আপনি কম বেশি চান।
আমি একটি স্ক্রিপ্ট তৈরি করেছি যা এই কাজটি সম্পাদন করে।
এই ধারণাটি জেমস লরির উত্তর এবং এই পোস্ট থেকে এসেছে: 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
rw-p
অনুমতি সহ কেবলমাত্র গ্রেপিং এবং রেঞ্জগুলি ছাড়ছেন ?
rw-p
), অন্যান্য রেঞ্জগুলি কোড ( r-xp
) এর জন্য । যদি আপনি উভয়ের একটি ডাম্প চান, তবে এগিয়ে যান এবং grep
উদাহরণস্বরূপ বিনিময় করুন cat
।
চেষ্টা
gcore $pid
$pid
পিডের আসল সংখ্যাটি কোথায় ; আরও তথ্যের জন্য দেখুন:info gcore
ডাম্পটি ঘটতে কিছুটা সময় নিতে পারে এবং কিছু স্মৃতি পড়তে পারা যায় না তবে যথেষ্ট ভাল ... এটিও সচেতন থাকুন যে এটি বড় ফাইল তৈরি করতে পারে, আমি সবেমাত্র একটি 2 জিবি ফাইল তৈরি করেছি ..
gcore
একটি বিক্ষিপ্ত ফাইল ডাম্পিং?
মানুষ proc বলেছেন:
/ proc / [pid] / mem এই ফাইলটি কোনও প্রক্রিয়ার স্মৃতির পৃষ্ঠাগুলি ওপেন (2), পঠন (2) এবং lseek (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 )
}
getconf PAGESIZE
পৃষ্ঠার আকার পেতে ব্যবহার করা হয় এবং তারপরে ঠিকানা এবং গণনাগুলি এর দ্বারা ভাগ করা হয়।
প্রক্রিয়াটিকে স্ট্যান্ডার্ড আউটপুট, প্যাক্যাট / মেমডম্প্পে ফেলে দেওয়ার সরঞ্জাম:
আপনি এখন লিনাক্সে সিসইন্টার্নালস স্যুট থেকে প্রোডডম্প ব্যবহার করতে পারেন:
/proc/$pid/mem
।