本文记录我近期在项目中碰到的一个真实案例——“一个线程意外死亡的bug”的分析定位过程,借此展示我们在软件调试的过程中,除了使用调试器单步跟踪外,还可以借助一些外部观察工具来辅助,比如:process explorer。
一、案例描述
近期一同事休假,扔下一堆代码项目给我维护。该项目有一个GUI窗口,窗口上有两个按键——btnA和btnB,分别控制两个工作线程thA和thB。其中,thB控制信号发出,thA控制信号接收。
thA和thB设计为独立工作,thB发而thA收,GUI窗口上就可以看到信号图形。一般地操作是:先按btnB后按btnA,软件可以正常工作。从设计上来说,thA和thB是独立的,那么交换顺序——先按btnA再按btnB,应该也是可以看到信号图形的。
这个bug的表现就是:交互btnA和btnB的点击顺序后,不能看到信号图形。
二、初步调试
首先,我们通过第三方设备直接测量thB发出的信号(硬件信号测量),发现发出的信号是正常的,排除了thB的问题。那么,我就集中精力来调试thA部分的代码。
thA是一个线程函数,里面维护了一个while循环,并通过一个flag来控制该循环,而这个flag由btnA控制。正常情况下,btnA启动后(按下),thA一直在进行这个while循环(扫描信号)。
初步调试,我选择使用VS2012进行源码单步调试。
在这个while循环的内外打了多个断点。