如果我单步调试阻塞的线程会发生啥?
Posted
技术标签:
【中文标题】如果我单步调试阻塞的线程会发生啥?【英文标题】:What will happen if I single step debug a blocked thread?如果我单步调试阻塞的线程会发生什么? 【发布时间】:2021-10-13 16:52:56 【问题描述】:如果我使用gdb
之类的调试器附加到进程并在当前线程处于阻塞操作中间时使用single step
会发生什么?
比如当前线程在等待sigwait
返回,我使用single step
。执行会继续,还是会停止直到sigwait
返回?
【问题讨论】:
你试过什么?结果不是预期的吗? 当你单步进入系统调用时,它只会等待系统调用返回。 实际上,我希望它会等待sigwait()
。从理论上讲,调试器可能会导致将信号发送到被调试的进程,从而导致sigwait()
返回 - 但是,我不希望调试器通常会做这样的事情。
【参考方案1】:
如果我使用像 gdb 这样的调试器来附加到进程并使用单步会发生什么
在大多数现代处理器上,GDB 通过设置单步处理器标志并恢复当前指令来执行single step
。一旦该指令完成,处理器将引发单步陷阱,这将导致操作系统通知 GDB 劣质(正在调试的)进程发生了什么事。 GDB 知道会发生这种情况(因为它记得你刚刚做了一个stepi
)。
当前线程何时处于阻塞操作的中间?
在这种情况下,当前指令是syscall
,因此在系统调用完成之前,单步陷阱不会执行。
比如当前线程在等待sigwait返回,我使用单步。执行会继续,还是会停止直到 sigwait 返回?
后者。
【讨论】:
IDA 和 GDB 是否有不同的Set Breakpoint
实现? AFAIK IDA 通过插入 INT 3
指令添加断点。但从您的回答看来,GDB 通过设置标志寄存器添加断点?
@user16387400 单步执行不需要在现代处理器上插入断点,但它用于无法在硬件中单步执行的处理器。以上是关于如果我单步调试阻塞的线程会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章