调试时发出信号

Fre*_*rik 10 c++ eclipse linux netbeans sigint

我正在使用C++在Linux上开发一个应用程序(服务/守护进程),它需要与一块硬件接口.如果我的程序在终止时没有干净地释放这些硬件的资源,那么我必须重新加载设备驱动程序,这个过程大约需要10分钟,并且由于显而易见的原因,在程序的每次测试之间必须等待10分钟很沮丧.

所以我已经使用该sigaction()函数来捕获一个SIGINT(一个ctrl-c),这样我的程序可以在我完成它时干净地关闭.从控制台运行程序时,这很好.但是,在Netbeans或Eclipse中调试时(我已经尝试过两者),事情不起作用.

  • 在Eclipse中,如果我在它提供的控制台中点击ctrl-c,它似乎没有注册SIGINT曾发生过
  • 在Eclipse中,如果我在调试模式下运行该程序然后使用kill -SIGINT <pid>,程序就会破坏,就像它遇到一个断点一样
  • Netbeans实际上似乎意识到当我在控制台中按下ctrl-c时已发送信号,并弹出一个对话框,询问我是否要将其转发给应用程序.单击"转发并继续"似乎打破了程序并且应用程序未收到信号.它还说我可以在Debug - > Dbx configure中配置这个东西,这是一个不存在的菜单项
  • 在Netbeans中,如果我以调试模式运行程序然后使用kill -SIGINT <pid>,则行为与上面相同
  • 然后我添加了一个SIGQUIT处理程序,并尝试kill在Netbeans中调试时发送.这次,没有出现对话框,信号处理程序永远不会被触发.

我需要一些方法来在我调试时干净地关闭我的应用程序.有任何想法吗?

Fre*_*rik 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
Run Code Online (Sandbox Code Playgroud)

等等...

我的临时工作是使用SIGALRM,gdb默认不破坏并发送到进程.但是,您也可以通过创建.gdbinit文件来自定义默认gdb设置,您可以在其中设置这些设置


lgm*_*m42 7

即使这篇文章很老,希望它可以帮助别人.

要防止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
Run Code Online (Sandbox Code Playgroud)

在eclipse配置中,您可以定义要在Debug配置中使用的.gdbinit文件的位置

Eclipse捕获