c++ - 调试时的信号

标签 c++ linux eclipse netbeans sigint

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

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

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

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

最佳答案

事实证明问题与 Netbeans 或 Eclipse 无关,而与 gdb 有关。

gdb 可以配置为以多种方式处理信号。如果你运行:

gdb

然后输入:

信息信号

您将获得一个信号列表以及 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 设置,您可以在其中设置这些设置

关于c++ - 调试时的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6136513/

相关文章:

c++ - 修改 vector 引用。什么无效?

linux - Linux进程是否仅在定时器中断时调度?

java - 如何在 Eclipse 工作区之外打开和编辑文件,同时使文件与 Eclipse 同步?

java - 在eclipse中编辑JSP会破坏特殊字符吗?

c++ - 如何在 C++ 中用枚举专门化函数的返回类型?

c++ - 从游戏中拦截视频帧

android - Android 上 native 线程的可能状态?

linux - 如何 tar 目录中的所有文件并将该 tar 移动到另一个目录

linux - 如何使用 Ubuntu "rename"工具替换目录名和文件名中的字符串?

java - 更新 Eclipse 的 Java 版本