2012-01-25 61 views
1

這是在Linux系統(紅帽發行版)上。如何調試處於不間斷睡眠的進程?

我有一個在Perl中實現的守護進程。它監控一張工作表,當它發現一個新工作表時,它會讓一個孩子執行工作。

我發現,孩子們掛在進程表在不間斷狀態:

682 16658 100 dumpdeco dumpdeco ?   0:27.62 0.0 1.8 D perl /root/runObjectBrowserJobs.pl 
1453 16658 100 dumpdeco dumpdeco ?   0:13.34 0.0 1.5 D perl /root/runObjectBrowserJobs.pl 
1458 16658 100 dumpdeco dumpdeco ?   0:12.42 0.0 1.5 D perl /root/runObjectBrowserJobs.pl 
1467 16658 100 dumpdeco dumpdeco ?   0:13.35 2.9 1.8 D perl /root/runObjectBrowserJobs.pl 
1474 16658 100 dumpdeco dumpdeco ?   0:14.31 0.0 2.1 D perl /root/runObjectBrowserJobs.pl 
1479 16658 100 dumpdeco dumpdeco ?   0:13.73 0.0 2.1 D perl /root/runObjectBrowserJobs.pl 
1496 16658 100 dumpdeco dumpdeco ?   0:13.97 0.0 2.0 D perl /root/runObjectBrowserJobs.pl 
1499 16658 100 dumpdeco dumpdeco ?   0:13.93 0.0 2.2 D perl /root/runObjectBrowserJobs.pl 
1501 16658 100 dumpdeco dumpdeco ?   0:14.47 0.0 1.4 D perl /root/runObjectBrowserJobs.pl 
1503 16658 100 dumpdeco dumpdeco ?   0:14.86 2.0 2.2 D perl /root/runObjectBrowserJobs.pl 
1505 16658 100 dumpdeco dumpdeco ?   0:13.88 1.0 2.0 D perl /root/runObjectBrowserJobs.pl 
1520 16658 100 dumpdeco dumpdeco ?   0:14.39 0.0 1.5 D perl /root/runObjectBrowserJobs.pl 
1522 16658 100 dumpdeco dumpdeco ?   0:14.12 1.0 1.8 D perl /root/runObjectBrowserJobs.pl 
1531 16658 100 dumpdeco dumpdeco ?   0:16.45 0.0 1.7 D perl /root/runObjectBrowserJobs.pl 
3619 16658 100 dumpdeco dumpdeco ?   2:03.59 0.0 4.5 D perl /root/runObjectBrowserJobs.pl 

我從我的記錄知道孩子們已完成了分配給他們的工作。他們已記錄此信息,並且已將作業從待處理隊列中刪除。所以,從代碼檢查來看,他們沒有什麼可以做的,只是退出。

這似乎是一個新現象。這是一段老的代碼,我已經完成了殭屍進程的舞蹈,所以我很確定這不是收穫不正確的問題。

我想弄清楚的是如何找出這些過程掛在什麼。我試過strace,但它不返回任何內容。說實話,這並不意外,因爲這個過程(我的猜測)並不是,實際上除了睡覺之外不做任何其他事情,等待一些系統調用返回。

所以,我在想:

  • 有沒有一種方法來打印一個正在運行的進程的當前調用堆棧?
  • 有沒有辦法在轉儲時轉儲進程並查看其調用堆棧?
  • 關於我應該尋找什麼的任何建議?我正在考慮一個破損的存儲驅動程序(最近我們的存儲設備還有其他問題),但指責驅動程序總是對我來說似乎是一個懶惰的選擇。
+0

什麼操作系統? – Nemo

+0

我會看看存儲的東西。狀態D的進程通常表明他們正在等待IO。由於這些過程本身沒有任何進展(IO是核心土地),strace將不會顯示任何東西。 – Friek

回答

0

難道你不知道嗎,我偶然發現了答案。該命令是pstack。更多的信息在這裏:http://linux.die.net/man/1/pstack

+4

使用gdb實現的pstack,並且在嘗試附加到我的不可中斷過程時掛起 – nhed