2011-05-26 71 views
8

我正在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處理程序,並嘗試通過kill在Netbeans中進行調試時發送該程序。這一次,沒有對話框出現,信號處理程序從不跳閘。

我需要一些乾淨地關閉我的應用程序,而我調試。有任何想法嗎?

回答

7

原來問題無關,使用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 

etc ...

我的節奏rary的解決方法是使用SIGALRM,gdb默認不會中斷併發送到進程。不過,您也可以通過創建一個.gdbinit中,您可以設置這些

+0

那麼,是否可以合理地使gdb處理SIGINT? 「.gdbinit」的內容是什麼? – 2012-11-01 02:12:11

2

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

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

此外,您可能會嘗試在退出之前清理您的應用程序。

+0

感謝您的,但如何我會選擇何時終止申請?如果我只是把它放在我的main()塊或類似的末尾,服務就會立即開始並停止。 – Frederik 2011-05-26 11:31:43

+1

說明'我將如何選擇何時終止應用程序?' :) – 2011-05-26 11:43:09

+0

正如我所說,這將是一個服務或守護進程。有時我需要測試它幾秒鐘,其他時候我需要運行更多的測試。關鍵是,我不能只說睡15秒,然後發送信號 - 我需要能夠在我選擇的時間終止程序。 – Frederik 2011-05-26 12:25:16

6

即使這個職位是舊的自定義默認設置GDB,希望它可以幫助別人。

爲防止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中的調試配置使用

Eclipse capture