对话框、陷阱和 SIGTRAP

对话框、陷阱和 SIGTRAP

我见过很多使用对话框工具到脚本中的示例,其行如下:

trap "rm $datafile" 0 1 2 5 15

我不明白的是SIGNAL 5的含义,好吧我知道是SIGTRAP。但遗憾的是,我仍然不明白它的真正意义......

提前致谢!!

答案1

有一个联机帮助页signal(7)

Signal         Value   Action   Comment
SIGTRAP        5        Core    Trace/breakpoint trap

此信号(如手册页所示)主要由调试工具(例如gdbstrace,分别是ptrace(2)系统调用)使用。如果一个进程正在通过 跟踪另一个进程的活动ptrace(2)SIGTRAP则将大量用于“中断”子进程,即使子进程在大多数情况下不会有效地知道发生了什么(通过 监视的进程ptrace(2)不一定会注意到已向其发送了哪个信号,因为跟踪器能够拦截和过滤传递的信号,SIGTRAP主要用于通知跟踪器发生了一些值得注意的事情)。

在这种情况下,查看ptrace(2)联机帮助页非常有启发性。

答案2

我不明白它的真正意义

让我们看看它是如何产生和使用的。

SIGTRAP的主要原因是int3指令。

我们可以通过以下方式检查:

int main() {
    asm("int3");
    return 0;
}

运行时输出:

Trace/breakpoint trap (core dumped)

并且退出状态133= 128 + 5,因此信号 5,SIGTRAP。

GDBint3在文本段中插入指令,设置ptrace,然后让程序运行。当它命中时int3ptrace唤醒可以监视孩子状态的父母。

请注意,还有硬件断点,它们具有不同的机制:硬件断点和软件断点有什么区别? |堆栈溢出

有关 int3 的更多信息

int3有两种编码:

  • NASM 中的常规int前缀 +3占用 2 个字节int 3
  • int3NASM 中特殊的 1 字节长编码

一字节长的编码是 GDB 的基础。如果指令大于 1 个字节,它可能会覆盖多条指令,这会很混乱。

相关内容