debugging时发出信号

我正在C ++的Linux上开发一个应用程序(真正的服务/守护进程),它需要与一个硬件接口。 如果我的程序在终止时没有彻底释放这个硬件资源,那么我必须重新加载设备驱动程序,这个过程大概需要10分钟,而且显而易见,在每个程序testing之间等待10分钟令人沮丧。

所以我使用了sigaction()函数来捕获一个SIGINT(一个ctrl-c),这样我的程序就可以完成closures了。 从控制台运行程序时,这工作正常。 但是,在NetBeans或Eclipse中进行debugging时(我已经尝试过)都不行。

  • 在Eclipse中,如果我在它提供的控制台中点击ctrl-c,它似乎没有注册一个SIGINT曾经发生过
  • 在Eclipse中,如果我在debugging模式下运行程序,然后使用kill -SIGINT <pid> ,程序就会中断,就好像它碰到了一个断点
  • 实际上,Netbeans似乎意识到当我在控制台中点击ctrl-c时,发送了一个信号,并popup一个对话框,询问是否要将它转发给应用程序。 点击“转发并继续”似乎打破了程序,信号没有被应用程序接收。 它也说我可以configuration这个东西在debugging – > Dbxconfiguration,一个不存在的菜单项
  • 在Netbeans中,如果我以debugging模式运行程序,然后使用kill -SIGINT <pid> ,则行为与上述相同
  • 然后我添加了一个SIGQUIT处理程序,并尝试通过在Netbeans中进行debugging时发送kill 。 这一次,没有对话框出现,信号处理程序从不跳闸。

我需要一些方法来清理closures我的应用程序,而我正在debugging。 有任何想法吗?

事实证明,这个问题与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设置,您可以在其中设置这些文件

即使这个帖子老了,希望能帮助别人。

为防止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配置中使用的位置

Eclipse捕获

简单的解决方案..尝试使用DEBUG宏来处理您的情况。

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

此外,您可能会尝试清理您的应用程序,然后退出。