11

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

所以我使用该sigaction()函数来捕获一个 SIGINT(一个 ctrl-c),以便我的程序在完成后可以干净地关闭。从控制台运行程序时,这工作正常。但是,在 Netbeans 或 Eclipse(我都尝试过)中进行调试时,事情不起作用。

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

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

4

3 回答 3

10

事实证明,这个问题与 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...

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

于 2011-06-27T11:12:25.097 回答
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

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

Eclipse 捕获

于 2015-01-22T08:50:45.167 回答
2

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

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

此外,您可以尝试在退出之前清理您的应用程序。

于 2011-05-26T11:19:50.907 回答