gpt4 book ai didi

c++ - Linux下捕获SIGKILL的调试程序

转载 作者:行者123 更新时间:2023-11-30 19:52:09 27 4
gpt4 key购买 nike

我在 Linux 下编写了使用 AVX 指令的小型 C++ 程序。但程序收到SIGKILL信号并退出。原因似乎是一些非法指令或传递给指令的错误值。我需要了解它在程序的哪个点收到 SIGKILL (最多在什么指令)。但是,当我在 GDB 中运行程序时,程序在收到 SIGKILL 时立即退出,并且无法调试。我尝试设置:

    (gdb) handle SIGKILL stop print nopass

但程序仍然收到 SIGKILL 并在我调试它之前退出。您对如何使用它有任何建议吗?

最佳答案

signal(7)手册页告诉我们,在非法机器指令(或 illegal opcode )上,

   SIGILL        4       Core    Illegal Instruction

信号已发送。请注意,它是 SIGILL 不是 SIGKILL(字母 K 有很大区别)。

回想一下,并非每个处理器都知道 AVX 。 (对于那些不支持 AVX 的系统,它可能是非法操作码)。输入cat/proc/cpuinfo(或grep avx/proc/cpuinfo)来了解您的处理器是否接受它。请参阅proc(5)

所以我猜你的程序正在获取 SIGILL (不是 SIGKILL)信号。

您可以捕获 SIGILL(但您无法捕获 SIGKILL)。

我在this answer (about SIGSEGV)中解释的内容适用于SIGILL;使用一些非常棘手的机器和系统特定的 C 代码,您可能捕获 SIGILL 并确保从信号处理程序返回时(随 安装) >SA_SIGINFO 并深入处理 ucontext_t* 第三个参数)在非法指令之外继续执行。

您可以配置gdb来明智地处理SIGILL。阅读signals chapter GDB 文档中,您可能需要 handle SIGILL 和/或 p $_siginfo 命令。

关于c++ - Linux下捕获SIGKILL的调试程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com