2010-07-27 14 views
8

Khi đọc/proc/$ PID/maps bạn sẽ nhận được vùng bộ nhớ được ánh xạ. Có cách nào để đổ một trong những khu vực này không?Bộ nhớ lưu trữ của một quá trình

$ 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]... 

Cảm ơn

Trả lời

10

Nah! Gọi ptrace() với PTRACE ATTACH. Sau đó, mở /proc/<pid>/mem, tìm cách bù vùng và đọc độ dài của khu vực như được nêu trong /proc</pid>/maps.

Đây là số program I wrote thực hiện trong C. Dưới đây là module I wrote thực hiện điều đó bằng Python (and the ptrace binding). Để hoàn thành, program that dumps all regions of a process to files.

Tận hưởng!

+0

Cool :) Cảm ơn rất nhiều – mathk

+0

Cảm ơn bạn đã đánh dấu. Có rất nhiều kinh nghiệm về công cụ này: P –

5

Bạn có thể đính kèm gdb để quá trình này sau đó đổ khu vực bộ nhớ các từ X chiều dài bắt đầu từ vị trí L với điều này: .

Gắn gdb khi bạn bắt đầu quá trình của bạn rất đơn giản: gdb ./executable rồi run. Nếu bạn cần đính kèm vào một tiến trình đang chạy, hãy bắt đầu gdb sau đó gdb attach pid trong đó pid là ID tiến trình mà bạn quan tâm.

+0

Cảm ơn, :) Tôi chưa từng nghĩ về nó – mathk

+1

Bạn có thể sử dụng đối số dòng lệnh để đính kèm vào một tiến trình đang chạy: 'gdb -p '. –

+0

Điều cần biết. Tôi đã chỉ sử dụng gdb nghiêm túc cho các mục tiêu từ xa. – nmichaels

4

Sử dụng dd (1):

sudo dd if=/dev/mem bs=1 skip=$((16#0059e000 - 1)) \ 
     count=$((16#005b1000 - 16#0059e000 + 1)) | hexdump -C