c++ 調試時發出信號




linux eclipse (3)

簡單的解決方案..嘗試使用DEBUG宏來處理您的情況。

// Register the signal handler to stop service.
#ifdef _DEBUG
        signal(SIGKILL, <your signal handler>);
#endif

此外,您可能會嘗試清理您的應用程序,然後退出。

我正在C ++的Linux上開發一個應用程序(真正的服務/守護進程),它需要與一個硬件接口。 如果我的程序在終止時沒有徹底釋放這個硬件資源,那麼我必須重新加載設備驅動程序,這個過程大概需要10分鐘,而且顯而易見,在程序的每次測試之間必須等待10分鐘令人沮喪。

所以我使用了sigaction()函數來捕獲一個SIGINT(一個ctrl-c),這樣我的程序就可以完成關閉了。 從控制台運行程序時,這工作正常。 但是,在NetBeans或Eclipse中進行調試時(我已經嘗試過)都不行。

  • 在Eclipse中,如果我在它提供的控制台中點擊ctrl-c,它似乎沒有註冊一個SIGINT曾經發生過
  • 在Eclipse中,如果我在調試模式下運行程序,然後使用kill -SIGINT <pid> ,程序就會中斷,就好像它到達了一個斷點
  • 實際上,Netbeans似乎意識到當我在控制台中點擊ctrl-c時,發送了一個信號,並彈出一個對話框,詢問是否要將它轉發給應用程序。 點擊“轉發並繼續”似乎打破了程序,信號沒有被應用程序接收。 它也說我可以配置這個東西在調試 - > Dbx配置,一個不存在的菜單項
  • 在Netbeans中,如果我以調試模式運行程序,然後使用kill -SIGINT <pid> ,則行為與上述相同
  • 然後我添加了一個SIGQUIT處理程序,並嘗試通過在Netbeans中進行調試時發送kill 。 這一次,沒有對話框出現,信號處理程序從不跳閘。

我需要一些方法來清理關閉我的應用程序,而我正在調試。 有任何想法嗎?


Answer #1

事實證明,這個問題與Netbeans或Eclipse無關,而是gdb。

gdb可以配置為以各種方式處理信號。 如果你運行:

gdb

然後輸入:

info signals

你會得到一個信號列表和gdb動作,如果它接收到該信號,該怎麼做:

Signal        Stop      Print   Pass to program  Description

SIGHUP        Yes       Yes     Yes              Hangup
SIGINT        Yes       Yes     No               Interrupt
SIGQUIT       Yes       Yes     Yes              Quit
SIGILL        Yes       Yes     Yes              Illegal instruction
SIGTRAP       Yes       Yes     No               Trace/breakpoint trap

等等...

我的臨時工作是使用SIGALRM,gdb默認不會中斷並發送到進程。 但是,您也可以通過創建一個.gdbinit文件來自定義默認的gdb設置


Answer #2

即使這個帖子老了,希望能幫助別人。

為防止Eclipse捕獲Ctrl + C,可以使用.gbdinit文件配置gdb。 你用這個內容創建一個.gdinit

#we want Ctrl+C to be no break, pass to application and printed by the debugger 
handle SIGINT nostop
handle SIGINT pass
handle SIGINT print

在你的eclipse配置中,你可以定義你的.gdbinit文件在Debug配置中使用的位置





sigint