程序在 strace 下工作但不正常
我有一個過程 - 一個 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 命令之後等待來自伺服器的響應?還是假設成功或在命令之間等待一段時間。
如果您在通過和失敗的情況下擷取實際的協議流量,是否有任何違反協議的跡象?