前几天,在写上位机代码的过程中,遇到了这样一个问题,当程序退出时,出现了卡死的现象。
刚开始没有去理会,但是当程序打开关闭多次之后,就有点不耐烦了,于是,debug一步步找出卡死原因。
跟上位机接口对接的是用VT,我不了解VT,以前也没用过VT,只是知道一点点应用,其中就有一个叫BB的东西,他是跟下位机对接的主要模块,说白了也就是windows上的一个DLL。于是,调试就从这个DLL的stop函数入手。
在stop()里面,调用了release(),在release里面实现了设备的关闭和内存的释放,两者都是在一个类里面实现,于是就进入类的析构,在类的析构里面,发现了一句waitforsingleobject(handle,INFINITE),程序就卡死在这里。
由于我不大懂windows编程,也不大懂windows上怎么用线程的,之前都是在linux上编程,于是只能google,终于,答案出来了,waitforsingleobject(handle,infinte)是在不断的等待handle的信号,我这里的handle是一个线程,如果线程不退出,就不会有返回,因为waitforsingleobject是阻塞的,所有程序卡死在那里,不断等待,看起来就是卡死得现象。
到这里,我才突然焕然大悟,原来是我关闭的时候,线程没有退出。之前,在我的记忆里,我只知道,进程关闭,它的线程都会被关闭,但是没有想到居然在主线程上阻塞自己...
解决办法很简单,让那个线程return就行了...
BB是一个很让我惊讶的地方,只要有点内存没释放,就会崩溃,在解决上面的问题后,我还得仔细研究下BB到底崩溃在哪里,所以,又 跟内存耗吧、、、
本文记录了一次上位机程序退出时出现卡死现象的排查过程。作者通过debug定位到问题出现在一个名为BB的DLL中,该DLL在关闭设备和释放内存时阻塞在了一个无限等待线程的状态。最终,通过终止线程解决了问题。
469

被折叠的 条评论
为什么被折叠?



