2011-02-18 41 views
0

我有一個用C語言編寫並在CentOS 5.5上運行的TCP Svr進程。它充當外部客戶端的TCP服務器,並使用它建立的Unix域套接字與系統中的其他進程進行IPC通信。這不是一個多線程的過程。它一次完成一項任務。有一個epoll_wait()用於偵聽TCP套接字或任何它使用內部進程建立的IPC套接字的請求。當epoll_wait()函數中斷時,我處理請求,然後返回到epoll_wait()如何使用DDD找到進程卡住的地方

我有一個TCP客戶端從外部(而不是IPC)連接到此進程。它連接成功,發送請求消息,得到迴應。我把它放在一個無限循環中 只是爲了測試它的健壯性等。

過了一會兒,TCP服務器停止響應來自TCP客戶端的請求。 TCP客戶端連接成功,發送請求消息,但它沒有從TCP服務器獲得任何響應消息。

所以我認爲TCP服務器卡在其他地方,試圖做一些事情,並沒有返回到epoll_wait()處理 其他請求進來。我試圖找出使用日誌,但那不是幫助我瞭解過程卡在哪裏。

所以我想使用任何調試器,可以給我一些信息(函數名稱會很好),至於過程在做什麼。把斷點,是壓倒性的,導致TCP服務器進程有大量的文件和功能....

我想在CentOS 5.5上使用DDD,想知道怎麼回事。我成功地關注了這個過程。然後我點擊「Step」或「Stepi」或「Next」按鈕.... 但沒有任何反應......

btw當我使用Eclipse進行調試並附加到這個進程(或任何進程) ,我總是會得到「__kernel_vsyscall()」....這是否意味着,無論它在做什麼,該程序默認在 中斷?如果是這樣的話,我怎麼才能從__kernel_vsyscall()調用中出來,在我的程序中繼續呢?如果我按f8,它會出來,但是我不知道它在哪裏,因爲我放棄了堆棧跟蹤......就像我之前說的那樣。因爲我不知道它在哪裏,我不知道在哪裏放置斷點....

總之,我想知道我的進程卡住了什麼地方,或者它在做什麼,並嘗試從那一點開始調試... 。

我該如何解決這個問題?

感謝 阿米特

回答

0

總之,我想要完成的是能夠找到我的程序停滯不前的時間。我明白了 - 非常簡單。在Eclipse中創建一個配置....「調試配置 - > C/C++附加到應用程序」...

讓流程從shell正常運行(最好連接一個終端)。當它掛起時,打開eclipse,點擊調試圖標並運行配置好的進程。它會要求你附加一個過程。尋找你的進程名稱並附加到它。

現在,只要看看整個堆棧跟蹤....你會看到一些你自己的函數調用內核函數調用混合。這告訴你程序停滯在哪裏。

0

1)安裝到C工藝常可引起自身的問題,有沒有什麼方法可以讓你開始在調試的過程?

2)使用DDD的步驟功能需要在設置斷點並且程序在命令上停止後完成。從閱讀你的問題,我不確定你是否做到了。您可能不想設置許多斷點,但是可以在關鍵代碼段中設置一個或兩個斷點?

+0

感謝您的信息。我想到了......請看我的答案。 – FatherFigure 2011-02-21 05:17:37