2013-08-30 32 views
0

我有一個C++應用程序,可以在Linux(ubuntu 12.04)中調用dummy1,我想在cgdb中調試一個到gdb的curl接口。 調試需要與控制器進程同步,我有它的來源。如何檢測進程是否正在調試

編輯控制器通過http連接並通信並控制dummy1。我想在某個功能中打破dummy1,並按照我喜歡的方式進行。發生這種情況時,我希望通知控制器。然後控制器應該改變它的狀態,直到它被通知我繼續dummy1。同時它不應該試圖控制dummy1或與dummy1進行通信。

我的問題是我怎麼檢測/通知控制器是/如果我的dummy1進程正在被調試(在休息)?

+0

你已經在想它了,只需添加一個命令行標誌並在調試器中啓動它時將它傳遞給你的應用程序。 – OneOfOne

+0

@naxa如果這是在x86上,您可以嘗試鉤住INT1和INT3。這是一些軟件會用來防止調試的一種技術。 –

+0

我曾經通過讓我的虛擬進程fork-exec成爲gdb實例來處理類似的問題,將pid作爲命令行的一部分發送。事實上,我實際上是通過一個帶有外部IP的'xterm'前端來完成顯示,因此我可以遠程調試它。類似的東西(可能不是*堅果,但也許是第一部分)可能適合你。 – WhozCraig

回答

2

有幾種可能的解決方案:

  • 直接回答你的問題:你的控制器能讀/ proc /進程/狀態(其中PID是,dummy1過程中),並期待在TracerPid場。如果非零,dummy1正在調試,並且控制器應該放棄嘗試控制。

請注意,這回答「正在調試dummy1」,而不是dummy1當前是否停止。爲了允許控制器再次進行控制,您必須從dummy1中分離GDB。

  • 一個可能更好的方法是GDB附加到 dummy1 控制器。然後,您可以在任何時候停止控制器,通過dummy1,恢復其中之一或兩者等。

新版本的GDB支持一次調試多個進程。不過,你可能會覺得這很混亂。

  • 另一種方法是簡單地運行兩個GDB實例 - 一個控制控制器,另一個控制dummy1。
相關問題