2011-07-13 117 views

回答

6

您應該在應用程序中查找原因,而不是在內核中查找。

通常當一個進程直接調用abortassert失敗時會收到SIGABRT。準確地找到傳遞信號的內核部分將不會帶來任何收益。

總之,您的代碼或您的代碼正在使用的庫造成這種情況。請參閱abort(3)assert

1

cnicutar的回答是最好的猜測恕我直言。

該信號可能是由另一個進程發出的,儘管在SIGBART的情況下,它很可能是由通過abort(3) libc函數接收它的相同進程發出的。

不能確定,您可以使用strace -e kill yourapp you args ...來運行您的應用程序,以快速檢查kill系統調用是否確實是從程序庫或相關庫中調用的。或使用gdb catch syscall

請注意,在臭名昭着的「OOM殺手」開始實施時,某些情況下內核本身可能會發出信號,例如SIGKILL

順便說一句,信號是異步傳遞的,它們擾亂了程序的正常工作流程。這就是爲什麼他們很難追查。除了SystemTap之類的機器外,我不知道如何跟蹤或記錄內核中的信號發射和傳輸。

+0

'abort'同步發送信號。所有你需要的是一個核心轉儲或者在調試器下運行以準確找到它被調用的位置。 – Nemo