发布
社区首页 >问答首页 >如何在clion中按下“停止”按钮来捕捉绑定的GDB发出的信号?

如何在clion中按下“停止”按钮来捕捉绑定的GDB发出的信号?
EN

Stack Overflow用户
提问于 2017-12-14 20:23:52
回答 2查看 1K关注 0票数 1

在clion中调试时,有一个“停止”按钮(红色方格)来停止运行的程序。目前,我正在编写测试并尝试调试它们。我的测试用例创建了临时目录和文件,这些目录和文件应该随后清理,但是在按下按钮时,既不调用析构函数,也不调用信号处理程序。

我就是这样处理信号的(其中许多信号,因为我不确定GDB实际使用了哪种信号):

代码语言:javascript
代码运行次数:0
复制
DLOG_S(INFO) << "Registering signal handlers for test files cleanup";
if (signal(SIGABRT, TemporaryDirectory::handle_cleanup) == SIG_ERR)
    DLOG_S(INFO) << "Registering SIGABRT failed";
if (signal(SIGTERM, TemporaryDirectory::handle_cleanup) == SIG_ERR)
    DLOG_S(INFO) << "Registering SIGTERM failed";
if (signal(SIGINT, TemporaryDirectory::handle_cleanup) == SIG_ERR)
    DLOG_S(INFO) << "Registering SIGINT failed";
if (signal(SIGALRM, TemporaryDirectory::handle_cleanup) == SIG_ERR)
    DLOG_S(INFO) << "Registering SIGALRM failed";

这是我的处理程序方法(是静态的):

代码语言:javascript
代码运行次数:0
复制
void test_utils::TemporaryDirectory::handle_cleanup(int signo) {
    DLOG_S(INFO) << "Received signal " << signo;
    if (signo == SIGABRT || signo == SIGTERM || signo == SIGINT || signo == SIGALRM) {
        DLOG_S(INFO) << "Cleaning up test files";
        TemporaryDirectory::test_files_root().cleanup();
    }
}

日志中没有注册失败消息,但我没有看到任何实际处理的信号。

我还尝试通过在GDB控制台中键入handle all nostop来更改配置,但即使这样做了,我的应用程序也会死掉。

在clion捆绑的GDB停止后,有什么方法可以清理吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-18 22:17:54

据我所知,当您在调试程序时单击Stop按钮时,CLion将:

  • 如果目标尚未停止,则向目标进程发送一个SIGINT信号,然后从gdb读取一个响应(如果有的话),说明目标接收了该信号。
  • 向gdb发送kill命令,这将导致gdb以不可捕捉的、不可捕获的SIGKILL信号杀死目标。
  • 向gdb发送-gdb-exit命令,这将导致gdb退出

如果发送了SIGINT,如果程序中有SIGINT处理程序,并且配置gdb使用例如handle SIGINT pass nostop noprint将信号传递给目标,则目标将运行其SIGINT处理程序,但在一秒钟后将被kill命令杀死。

如果您想给程序一个通过调用信号处理程序来清理的机会,可以重新定义gdb的kill命令以发送您选择的信号,使用signal命令:

代码语言:javascript
代码运行次数:0
复制
define kill
  signal SIGTERM
  shell sleep 5
end

(OP曾经说过,不需要shell sleep 5就能按需要工作。)

票数 1
EN

Stack Overflow用户

发布于 2017-12-14 20:31:18

要处理gdb中的信号,请在调试会话中使用handle signal keywords...。更多细节:https://sourceware.org/gdb/onlinedocs/gdb/Signals.html

顺便说一句,这不是gdb向您发送信号,而是内核。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47821467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档