C++ 如何在clion中按“捕获捆绑GDB发出的信号”;停止“;按钮

C++ 如何在clion中按“捕获捆绑GDB发出的信号”;停止“;按钮,c++,gdb,clion,C++,Gdb,Clion,在clion中调试时,有一个“停止”按钮(红色方块),用于停止正在运行的程序。目前,我正在编写测试并尝试调试它们。我的测试用例创建了临时目录和文件,这些目录和文件应该在之后清理,但按下按钮时,不会调用析构函数或信号处理程序 这就是我处理信号的方式(其中许多信号,因为我不确定GDB实际使用的是哪一个): DLOG_S(INFO)要在gdb中处理信号,请在调试会话中使用handle signal关键字…。更多详情: 顺便说一句;它不是gdb向您发送信号,而是内核。据我所知,当您在调试程序时单击停止按

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

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


DLOG_S(INFO)要在gdb中处理信号,请在调试会话中使用
handle signal关键字…
。更多详情:


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

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

  • 如果目标尚未停止,则向目标进程发送一个
    SIGINT
    信号,然后从gdb读取关于目标已接收信号的响应(如果有)
  • 向gdb发送
    kill
    命令,这将导致gdb使用不可跟踪、不可识别的
    SIGKILL
    信号杀死目标
  • 向gdb发送
    -gdb exit
    命令,这将导致gdb退出
如果发送了SIGINT,并且您的程序中有一个SIGINT处理程序,并且您已经配置了gdb,以便使用例如
handle SIGINT pass nostop noprint
将信号传递给目标,则目标将运行其SIGINT处理程序,但会在几秒钟后被
kill
命令杀死

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

define kill
  signal SIGTERM
  shell sleep 5
end

(OP已经说过,在不需要
shell sleep 5
的情况下,事情按预期运行)

问题是,我不知道GDB在停止时发送的是哪个信号。我尝试了
处理所有nostop
命令,据我所知,该命令应该允许我处理来自应用程序的信号,但它不起作用。此外,我甚至不确定GDB是否发送了任何信号。似乎它在沙箱环境中运行应用程序,并在没有任何警告的情况下杀死它…@MarkPlotnick是的,我知道是GDB发出了信号。但当你按下clion上的那个按钮时,它发出的是什么信号对我来说是个谜。另外,我在标签中添加了clion,因为其中有一个捆绑的GDB,它的工作方式可能与独立的GDB不同……正如您在上面看到的,我已经尝试过处理
SIGTERM
,但没有任何效果。据我所知,如果您正在调试(而不是运行)目标,然后,CLion将向目标发送SIGINT,然后立即向gdb发送一个
kill
命令,gdb(通过ptrace)向目标发送不可识别、不可跟踪的
SIGKILL
信号,然后CLion告诉gdb退出。@MarkPlotnick好的,但是有没有办法将gdb配置为不发送
SIGKILL
,而是发送另一个(可捕获的)而是发信号?
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();
    }
}
define kill
  signal SIGTERM
  shell sleep 5
end