如何解决调试时发出信号
| 我正在用C ++在Linux上开发需要与硬件交互的应用程序(实际上是服务/守护程序)。如果终止时我的程序没有干净地释放用于此硬件的资源,则我必须重新加载设备驱动程序,该过程大约需要10分钟,并且出于明显的原因,每次程序测试之间必须等待10分钟会令人沮丧。 因此,我已经使用ѭ0函数捕获了SIGINT(ctrl-c),以便在我完成程序后可以干净地关闭程序。从控制台运行程序时,这可以正常工作。但是,在Netbeans或Eclipse中调试时(我都尝试过),这些都无法正常工作。 在Eclipse中,如果我在它提供的控制台中按ctrl-c,似乎并没有注册曾发生过SIGINT 在Eclipse中,如果我在调试模式下运行该程序,然后使用kill -SIGINT <pid>
,则该程序会像遇到断点一样中断
当我在控制台中按ctrl-c时,Netbeans实际上似乎意识到已经发送了一个信号,并弹出一个对话框询问我是否要将其转发到应用程序。单击\“转发并继续\”似乎中断了程序,并且该应用程序未收到该信号。它还说我可以在Debug-> Dbx configure(不存在的菜单项)中配置此东西
在Netbeans中,如果我在调试模式下运行程序,然后使用kill -SIGINT <pid>
,则其行为与上述相同
然后,我添加了一个SIGQUIT处理程序,并尝试在Netbeans中进行调试时通过kill
发送该处理程序。这次,没有对话框出现,并且信号处理程序从未跳闸。
我需要一些方法在调试时彻底关闭我的应用程序。有任何想法吗?
解决方法
事实证明,该问题与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配置中使用的位置
,简单的解决方案。尝试使用DEBUG宏来处理您的情况。
// Register the signal handler to stop service.
#ifdef _DEBUG
signal(SIGKILL,<your signal handler>);
#endif
另外,您可以尝试在退出前清理应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。