2012-12-10 81 views
7

我正在嘗試使用python和python ptrace來讀取外部進程的內存。我需要完全用python工作,並且我一直試圖在Linux中讀取和打印一個進程的內存。如何在linux中讀取python進程的內存?

因此,例如,我試過下面的代碼,它不斷給我IO錯誤:

proc_mem = open("/proc/%i/mem" % process.pid, "r") 
print proc_mem.read() 
proc_mem.close() 

主要是我只是想重複轉儲進程的內存,並查找隨時間的變化。如果這是做到這一點的正確方法,那麼我的問題是什麼?還是有更合適的方法來做到這一點?

+5

這似乎是在http://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux – larsks

+0

詳細回答,似乎是這樣試圖讀取/ proc /%i/mem文件並不是我想要這樣做的方式。所以我猜想我的問題的另一半。假設我可能想寫入進程內存頁面,是否有適當的方法在python中執行此操作?我正在使用ptrace來啓動和停止該進程。 – rvorderm

+0

這個[鏈接]給出的演示程序(http://www.mail-archive.com/[email protected]/msg00011.html):似乎與我正在做的事情密切相關,雖然我還沒有能夠相當複製這一點。 ptrace中有一個函數,用於在內存映射中搜索字節字符串。 – rvorderm

回答

3

呼叫從蟒蛇外殼命令 - 子模塊

import subprocess 

# ps -ux | grep 1842 (Assuming 1842 is the process id. replace with process id you get) 

p1 = subprocess.Popen(["ps", "-ux"], stdout=subprocess.PIPE) 
p2 = subprocess.Popen(["grep", "1842"], stdin=p1.stdout, stdout=subprocess.PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
print output 

,並通過輸出解析,看看它的內存使用率

+1

解析格式化輸出似乎不像使用/ proc fs那麼幹淨 - 這正是它的目的。 – hexparrot

+0

你說得對。但是根據需求的範圍,理解命令並解析它比理解proc文件系統更容易嗎?如果沒有,我猜Iarsks提供的鏈接足夠好地回答了這個問題 – Sudheer

+0

這最終成爲我最接近我想到的東西。更重要的是,對於我正在進行的項目來說,這已經足夠了。 – rvorderm

1

主要是我只是想重複轉儲過程的記憶和查找隨時間變化。如果這是做到這一點的正確方法,那麼我的問題是什麼?還是有更合適的方法來做到這一點?

您可能有興趣gdb的reverse debugging,它記錄過程記憶的所有變化。這裏是the tutorialgoogle cache)。

還有Robert O'CallahanChronicle/Chronomancerwork,如果你想玩原始錄音工具。

+0

這也是一個很棒的答案。事實上,除了已經用Sudheer的答案完成了我的小項目以外,它本來就是我接受的答案。 – rvorderm