【发布时间】:2017-12-14 20:23:52
【问题描述】:
在 clion 中调试时,有一个“停止”按钮(红色方块)可以停止正在运行的程序。目前,我正在编写测试并尝试调试它们。我的测试用例创建了应该在之后清理的临时目录和文件,但是在按下按钮时既不会调用析构函数也不会调用信号处理程序。
这就是我处理信号的方式(其中很多,因为我不确定 GDB 实际使用的是哪个):
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";
这是我的处理方法(静态):
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停止后有什么办法清理吗?
【问题讨论】:
-
@MarkPlotnick 是的,我知道是 GDB 正在发送信号。但是,当您按下 clion 中的那个按钮时,它会发出什么信号,这对我来说是个谜。另外,我在标签中添加了 clion,因为其中有一个捆绑的 GDB,它的工作方式可能与独立的 GDB 不同......
-
另外——正如你在上面看到的——我已经尝试处理
SIGTERM但无济于事。 -
据我所知,如果您正在调试(而不是运行)目标,那么 CLion 将向目标发送 SIGINT,然后立即向 gdb 发送
kill命令,这向目标发送(通过 ptrace)不可忽略、不可捕获的SIGKILL信号,然后 CLion 告诉 gdb 退出。 -
@MarkPlotnick 好的,但是有没有办法配置 GDB 不发送
SIGKILL,而是发送另一个(可捕获的)信号?