在gdb中对线程执行finish命令无返回,是否说明该线程已卡住?
结论
当前现象不足以100%证明该FIFO从未接收数据就是卡顿根源,仅可作为强怀疑依据,仍有其他可能性需要排除
需排除的干扰场景
- 执行
finish命令前未确保当前栈帧处于等待FIFO的最顶层调用:如果之前你查看过下层栈帧没有切回,finish会等待上层栈帧对应的函数返回才会触发gdb中断,就算FIFO读取返回后线程进入了其他阻塞逻辑,gdb也不会停止,会给你一种一直卡在FIFO读取的错觉。 - FIFO有数据返回但线程快速回到等待逻辑:如果读取到数据的处理逻辑非常短,处理完成后立刻再次进入FIFO等待调用,
finish触发的返回过程无明显感知,会让你误以为读取函数从未返回。 - FIFO写入链路异常而非无数据写入:比如写入端进程意外退出、FIFO写入权限被回收、FIFO缓冲区满后写入端一直阻塞未写入新数据,都会导致读取端持续卡在调用上,并不是FIFO完全没有接收数据的能力。
无侵入验证方案
不需要修改业务代码调整时序,通过以下操作即可确认根因:
- 再次用
Ctrl+C中断程序,切换到9号线程后执行frame 0切换到最顶层栈帧,确认栈顶就是等待FIFO的读取调用后,给该调用的下一行代码打临时断点:b *[读取FIFO函数返回后的下一行指令地址],再执行continue,只要读取函数返回就会触发断点,可直接确认是否有数据返回。 - 新开终端不干扰gdb运行,执行
lsof -p 你的进程ID查看该FIFO的读写端挂载状态,确认写入端是否正常存活;再执行cat /proc/你的进程ID/fdinfo/[FIFO对应的文件描述符编号]查看缓冲区读写偏移,可直接确认FIFO中是否有未读数据、是否有过数据写入。
内容的提问来源于stack exchange,提问作者Alexis Wilke
相关产品推荐
相关产品推荐

