2013-11-28 70 views
3

我有一個單線程的unix進程,通過tcp與其他進程進行通信。strace修復掛起進程

問題是以下幾點。 當我啓動這個進程時,它會掛起(沒有忙循環),直到我殺死它。

有趣的是,只要我一直強調它,它就會繼續以預期的行爲運行,就好像根本沒有問題一樣。 (始終可重現)

這種行爲的原因是什麼?國家對進程有什麼影響?

更新: strace改變行爲的原因是,因爲我們用一個bug的openonload。一旦我們連接了strace,堆棧被移回內核,問題就消失了。

+0

如果代碼是線程化的,則可以通過控制進程來避免爭用條件,該代碼在代碼執行過程中強制執行不同點的上下文更改,而不是在代碼本地運行時發生。對有問題的線程代碼運行調試器有時會導致代碼不能解決問題 - 對我來說。 –

+0

是的,但OP說「單線程」:) – loreb

+0

我也有類似的情況......掛起的過程工作正常,如果我附加strace。任何人都可以詳細解釋? – ernesto

回答

0

只有一次這個問題,它與信號處理有關,它是單線程代碼中競爭條件的一個來源。

0

最有可能的strace輸出只會減慢進程,使得死鎖的可能性更小。我以前見過這種情況發生在使用strace或在添加其他調試打印或調試調用時可能發生。

死鎖最常見於多線程交互。但在你的情況下,你有多個進程。如果strace每次都釋放進程,那麼我想你打開套接字或握手的方式就是掛起。在套接字上緩衝和阻塞我認爲可能會使您陷入進程死鎖狀態。

類似的問題,但有一個多線程程序,線程死鎖,而不是單獨的進程之間:Using strace fixes hung memory issue

很難一概而論的例子,尤其是不知道自己的不同的進程正在做什麼,或者如果他們以某種方式分享資源?我會嘗試 。 。 。

  1. 與一個對象/資源應被保護的實施例:
    一個過程開始製造物體上的變化(例如,將項目添加到列表/ db表)
    的另一種方法開始迭代列表/表。
    這些進程之一的危險迭代循環被混淆,從不退出或者做更糟的事情,比如寫入無效內存。

  2. 對象/資源受互斥鎖保護的示例
    帶有兩個資源問題的經典簡單死鎖。 〜比餐飲哲學家簡單
    一個線程/進程獲取對象A上的互斥鎖,做了一些工作。
    另一個線程/進程在對象B上獲取互斥量,做一些工作。
    同一個線程/進程需要更新對象A,等待A的互斥體。
    原始線程/進程需要訪問對象B,等待B上的互斥體。
    。 。 。 。 。 。 。 。 。 。 。 。 @。 。 。 。 。 。 。 。 。 。 。
    除了風的噪音和橫掃風景的風滾草之外,他們都沉默了。
    僵局。