2010-06-14 70 views
4

我有一個進行配置管理的守護進程。所有其他進程都應該與這個守護進程交互以實現其功能。但是當我執行一個大動作時,在幾個小時後,守護進程在2到3個小時內沒有響應。並且2-3小時後它正常工作。爲Linux進程掛起問題調試實用程序?

調試Linux進程掛起問題的實用程序?

如何獲得Linux進程掛起的點?

回答

1

一個選項是使用gdb並使用attach命令爲了附加到正在運行的進程。您將需要加載包含可執行的有問題的符號(使用file命令)

+1

你也可以直接從'gdb/path/to/executable PID'的命令行執行此操作' – 2010-06-14 05:47:11

9
  • strace的一個文件,可以顯示最近的系統調用,並且結果
  • lsof的可以顯示打開的文件
  • 系統當日志消息被寫入跟蹤進度時,日誌可以非常有效。允許在較小的區域中填充問題。同時將日誌消息與來自其他系統的其他消息相關聯,這通常會產生有趣的結果
  • wireshark如果應用程序使用套接字使線纜可見。
  • ps ax + top可以顯示您的應用程序是否處於繁忙循環,即始終運行,睡眠或在IO中佔用,使用CPU,使用內存。

這些都可能給出一些信息,這些信息一起構成了問題的圖片。

使用gdb時,在應用程序被阻止時觸發核心轉儲可能很有用。然後你有一個靜態快照,你可以在你的閒暇時使用驗屍調試進行分析。你可以讓這些腳本觸發它們。你快速建立一組快照,可以用來測試你的理論。

+0

我不認爲'ps ax'是檢測繁忙循環的好工具,'top'會更好這個 – 2010-06-14 06:11:45

+0

你當然是對的,我傾向於使用這些幾乎總是並排的,所以他們混淆了我的腦海。謝謝,我更新了答案 – 2010-06-14 07:28:17

+0

嗨,彼得, strace幫助我解決了掛起問題。 掛起是因爲使用'flock()'的文件鎖定的兩個進程之間的死鎖場景。 非常感謝您的幫助。如果沒有了解,那麼找出這個過程爲何懸而未決是一項不可能完成的任務。 – Niranjan 2010-06-17 09:18:05

0

有做了許多不同的方式:

  1. 監聽一個UNIX域套接字,來處理狀態請求。然後外部應用程序可以詢問應用程序是否仍然正常。如果在某個超時期限內沒有得到任何迴應,那麼可以認爲被查詢的應用程序已經死鎖或者死機。

  2. 定期觸摸具有預選路徑的文件。外部應用程序可以查看該文件的時間戳,如果該文件已過時,則可以認爲該應用程序已死或死鎖。

  3. 您可以反覆使用alarm系統調用,使信號終止進程(相應地使用sigaction)。只要您繼續撥打alarm(即只要您的程序正在運行),它就會繼續運行。一旦你不這樣做,信號就會發射。

,因爲它與forkwaitpid死亡描述in this answer您可以無縫地重新啓動過程。它不會花費任何重要的資源,因爲操作系統將共享內存頁面。