在调试会话中,当deugger想要设置断点时,它会用int3替换指令。当目标进程到达此指令时,该进程将停止。我已经读过此时发送的信号。但我没有设法捕获这个信号(我写了我自己的迷你调试器进行测试)。谁发送这个信号?内核?谁是接收者? 我必须在ptrace_cont之后放一个wait()fonction juste。你认为这是一个捕获信号的等待函数,以通知调试器进程到达断点吗?
答案 0 :(得分:1)
当目标流程达到此指令时,流程将停止。
这不太准确。执行陷阱指令(x86上的0xCC
)时,处理器会通知操作系统。在UNIX上,操作系统会检查进程是否由某人ptrace
进行检查。
如果不是,SIGTRAP
信号将传递给应用程序,这通常会导致进程被终止(但您可以捕获并处理应用程序中的信号)。
如果 是ptrace
(通常是调试器),则信号不会传递给应用程序。相反,调试器的wait
被解锁以通知调试器下级已经改变了状态。调试器然后查看劣质进程停止的位置,发现它是因为断点而这样做的,并且在适当时处理这种情况(让你检查下级,或者如果断点是有条件的,则恢复它并且当前条件不适合#39; t match等。)