2012-02-02 83 views
2

我正在調試一個相當大的Qt-3應用程序。該應用程序進行大量的預處理,然後接收SIGPIPE信號。我一收到SIGPIPE就立即寫下幾條回溯條目。調試來自第三方庫的SIGPIPE信號

#0 .. __write_nocancel() from libpthread.so 
#1 .. _IceTransFreeConnInfo() from libICE.so.6 
#2 .. _IceWrite() from libICE.so.6 
#3 .. _IceFlush() from libICE.so.6 

我們的應用程序有一個信號處理程序。我所做的是忽略SIGPIPE使用signal(SIGPIPE, SIG_IGN),認爲我的應用程序將繼續,即使我得到這個信號。但是現在我意識到它不會以這種方式工作,如果我在收到SIGPIPE後繼續存在,它就會存在。

我無能,如何調試這個問題。這個信號不是直接來自我們的應用程序的套接字調用。它來自libICE。我對麼?請提供一些關於如何調試的提示。

在此先感謝。

+1

當應用程序本身'raise()'信號時,你應該能夠在調試器中捕獲該信號。 – PlasmaHH 2012-02-02 11:12:07

+0

@PlasmaHH:誰說'raise()'什麼的? – SamB 2012-02-02 19:46:53

回答

1

該信號來自內核,並且是write(2)的結果,該文件描述符爲接收器已經死亡或執行shutdown(2)

聽起來好像在你的代碼中的東西搞砸了屬於libICE.so而不是你的文件描述符。

您的第一步應該是運行strace下的應用程序,然後分析日誌以確切瞭解libICE正在寫入的FD是如何搞砸的。

一旦你知道發生了什麼,使用GDB catch syscall命令找出其中它正在發生。