2013-03-22 31 views
7

我要轉儲正在運行的進程是核心,根據/proc/<pid>/status,目前阻塞磁盤活動。實際上,它忙於在GPU上工作(應該是4小時的工作,但現在已經花費了很長時間)。我想知道該流程的工作已經完成了多少,所以能夠轉儲流程的內存會很好。然而,據我所知,「阻止磁盤活動」意味着不可能以任何方式中斷過程,使用gdb需要中斷並暫時停止進程以便通過ptrace連接,對吧?我能否在磁盤活動上阻塞進程(最好不要殺死它)?

我知道我可以以root身份讀取/proc/<pid>/{maps,mem}以獲得(可能不一致的)內存狀態,但我不知道任何方法來獲取進程的用戶空間CPU寄存器值......它們保持不變該進程在內核中,對嗎?

+0

你可以在源代碼中添加每半小時寄存器的打印.... – 0x90 2013-03-22 10:04:30

+0

當然,我會更高興比大約爲推出自己的核心轉儲製造商一個現成的解決方案。 :( – thejh 2013-03-22 10:11:38

+0

@ 0x90的權利,但我希望能夠這樣做到一個已經運行的程序,因爲我不想通過強制重啓失去約9h的計算數據或等待未知的時間這個東西要完成(如果它沒有卡在某個地方),而且「每半小時」都不會這樣做 - 在輸入一個可能(或將要)阻止「磁盤」的方法之前,你必須一直這麼做IO」的時間 – thejh 2013-03-22 10:15:38

回答

3

你或許可以在你的程序運行gcore。它基本上是附在GDB上的一個包裝器,使用gcore命令並再次分離。

這可能會打斷你的IO(就像它接收到信號,它會),但如果正確寫入你的程序可能可以重新啓動它(這可以在任何情況下發生的,由於默認處理)。

+0

作爲一個側面說明擴展量,我只是嘗試這樣一個簡單的Hello World類型的程序。成'閱讀()'自動恢復通話。 – Hasturkun 2013-03-24 12:44:44

+0

酷!您可以發佈源在你的答案? – Jess 2013-03-24 12:49:17

+0

?@Jessemon:對於世界你好這基本上'焦炭℃;的printf(「你好\ N!」);閱讀(0,&c, 1);'正如我所說的,沒有什麼高明 – Hasturkun 2013-03-24 12:51:16