我理解单步执行和int 3
字节如何用于调试程序。在第一种情况下,跟踪器使用PTRACE_SINGLESTEP
能够一次调试一个指令的程序。在x86上,这意味着在调试时将设置陷阱标志。在第二种情况下,0xcc
个字节被插入到tracee的地址空间中,每当SIGTRAP出现时,控制权就会传递回跟踪器(调试器)。
现在,当我使用gdb调试器附加到程序时,tracee暂停。内部会发生什么?是否插入了0xcc
个字节? ptrace库如何暂停tracee的执行?
答案 0 :(得分:3)
ptrace
是一个系统调用,由内核实现。内核决定进程是否可以执行。当它以普通的方式通过ptrace
连接时,它会暂停执行 - 大概是通过设置一个标志而不是安排它,但我从来没有看过那么深。
请注意,较新版本的Linux内核包含PTRACE_SEIZE
请求,可用于在不停止进程的情况下附加到进程。 ptrace
手册页对此进行了解释。