2011-05-26 55 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