2015-10-06 108 views
0

我有一個多線程應用程序,運行30多線程。我知道有一個錯誤,有時兩個線程試圖同時排序一個列表,這通常會導致其中一個線程訪問無效內存。因此,爲該線程生成了一個SIGSEGVSIGSEGV不終止進程

現在,根據我對信號的瞭解,線程應調用SIG_DFLSIGSEGV,這是異常終止進程和coredump。然而,我看到這個過程仍然活着(處於一種不靈活的狀態),執行停止,但過程仍然存在。當我試圖kill它時,SIGTERM實際上傳播到我的自定義信號處理程序(它試圖很好地關閉所有線程),但它掛起,因爲沒有任何線程實際上執行了。我終於設法使用SIGQUIT殺死它,並在那之後生成了核心文件。

所以我的問題是「異常終止」是什麼意思?如果SIG_DFL被稱爲SIGSEGV,如何不能從內存中刪除進程?可能會發生什麼導致這種行爲?我的Linux是紅帽企業Linux服務器版本5.11(Tikanga)

編輯:我知道(或多或少)如何調試它,我甚至知道錯誤是什麼。我的問題是或多或少:在SIGSEGV調用SIG_DFL時,RedHat究竟做了什麼?問題在於這個過程沒有響應,但也沒有死亡 - 因此自動重啓程序沒有啓動,我們有一些不愉快的停機時間。

+0

你說你有一個自定義信號手柄,它有什麼作用? – Adam

+0

SIGTERM的預期行爲是終止進程,但可以捕獲SIGTERM並執行其他操作。 SIGKILL是不可撤銷的強制退出。即'kill -9 12345' – Adam

+0

另外,有沒有'ps'列出你的程序爲?如果是這樣,這是一個殭屍進程(即它退出,但它的返回值尚未被啓動過程讀取)。 – Adam

回答

0

這種情況並不像我想的那麼簡單。原來的問題是兩個線程之間的死鎖。當我發出SIGTERM時,實際上我的自定義信號處理程序在(現在未解鎖)線程中導致了段錯誤。