Redhat

程序在 strace 下工作但不正常

  • May 9, 2014

我有一個過程 - 一個 perl 腳本 - 它可以:

while true
   check a POP account on a server on the lan
   process any email found
   write logs - messages found, actions taken, errors
   sleep for 15 seconds

它在 redhat 7.3 伺服器上執行(我繼承了它,我對那個盒子的年齡不滿意)。它已經用完了 /etc/inittab ,例如:

spop:2345:respawn:/usr/local/gw/bin/popdmn 

如果它死了,init 會重新啟動它。

在過去的幾天裡,該過程將不再起作用*,除非*它被跟踪。當它剛剛執行時,它永遠不會登錄到彈出伺服器。一旦它被跟踪(通過“strace -Ff -p cat /usr/local/gw/var/popdmn.pid”),它就可以完美地工作。

作為一種解決方法,我正在執行 strace 的伺服器上執行螢幕。顯然,這不太理想。

為什麼程序會這樣做?我以前從未見過這種情況。

我想我被一個古老的 strace 蟲子咬了:

https://bugzilla.redhat.com/show_bug.cgi?id=64303

https://bugzilla.redhat.com/show_bug.cgi?id=75709

這個盒子上有 strace-4.4-4,所以聽起來可能就是那個錯誤。這聽起來像是自己造成的,因為我們在嘗試調試時一直在跟踪 - 並且使情況變得更糟。

kill -CONT努力恢復該過程。

絕對是時候升級這個盒子了。

我想最大的區別是速度和信號處理。

關於速度,如果程序是多執行緒的,那麼 strace 將改變時間,這會改變我在競爭條件等方面的行為與協議行為相關的時間資訊。

例子。假設 POP 伺服器已經升級,現在更加小心地確保對等方沒有同時發送多個 POP 命令。這在 SMTP 伺服器中作為一種垃圾郵件預防手段更為有用。

您的程序是否觀察到正確的 POP 行為,因為它在每個 POP 命令之後等待來自伺服器的響應?還是假設成功或在命令之間等待一段時間。

如果您在通過和失敗的情況下擷取實際的協議流量,是否有任何違反協議的跡象?

引用自:https://serverfault.com/questions/594080