如果我单步调试阻塞的线程会发生啥?

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 单步执行不需要在现代处理器上插入断点,但它用于无法在硬件中单步执行的处理器。

以上是关于如果我单步调试阻塞的线程会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 vscode 调试多线程 C 程序时单步切换线程

logging:多线程调试时用来代替print和单步调试

GDB 调试多线程程序的总结

Parallel.ForEach 调试或单步执行

release版本单步调试设置

VBA 在运行时崩溃,但在单步执行时工作