我见过很多使用对话框工具到脚本中的示例,其行如下:
trap "rm $datafile" 0 1 2 5 15
我不明白的是SIGNAL 5的含义,好吧我知道是SIGTRAP。但遗憾的是,我仍然不明白它的真正意义......
提前致谢!!
答案1
有一个联机帮助页signal(7)
:
Signal Value Action Comment
SIGTRAP 5 Core Trace/breakpoint trap
此信号(如手册页所示)主要由调试工具(例如gdb
或strace
,分别是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
,然后让程序运行。当它命中时int3
,ptrace
唤醒可以监视孩子状态的父母。
请注意,还有硬件断点,它们具有不同的机制:硬件断点和软件断点有什么区别? |堆栈溢出
有关 int3 的更多信息
int3
有两种编码:
- NASM 中的常规
int
前缀 +3
占用 2 个字节int 3
int3
NASM 中特殊的 1 字节长编码
一字节长的编码是 GDB 的基础。如果指令大于 1 个字节,它可能会覆盖多条指令,这会很混乱。