记两遍调试串口设备Bug的经历

前不久花了大多1天的光阴在折磨一个Bug,该Bug的表象如下: 

ACCESS 1

ACCESS 2

本条Bug还专门杰出,在付出电脑中无提醒,在终端用户那里每趟使用软件的时候都报那几个。仔细想想了须臾间以来在源码中新丰裕的机能,没察觉有甚越发鲜明的难题。于是,按照字面意思的敞亮是“运行时不当”,所以一早先解决那么些标题标笔触是将兼具应用程序的周转时拷贝至应用程序目录。尝试过未来,仍然报这些丰裕。分析可能跟运行时的动态链接库没有涉嫌。于是,调整解决难题的笔触,考虑将工程中新拉长的代码进行剪切。部分部分的测试新拉长的代码到底那里有难题,排查到最终是那几个函数内部暴发了越发。十分函数的代码如下:

void CleanSerialPort()
{
    if(g_hEvent != NULL)
    {
        CloseHandle(g_hEvent);
        g_hEvent = NULL;
    }

    if(g_SerialPort.IsOpen())
    {
        COMMPROP properties;
        memset(&properties, 0, sizeof(properties));
        g_SerialPort.GetProperties();
        g_SerialPort.ClearWriteBuffer();
        g_SerialPort.ClearReadBuffer();
        g_SerialPort.Flush();
        g_SerialPort.CancelIo();
        g_SerialPort.Close();
    }
}

ACCESS,一初步细致读了五回代码,没发现有甚十分的地方。在这一个时候,只可以通过一点一点调节编译器来最终确定难点在那边。调试编译器的章程比较传统,是透过MessageBox音讯来促成。最后一定到g_SerialPort的Close函数。该函数的原型如下: 

void CSerialPort::Close()
{
    if(IsOpen())
    {
        CloseHandle(m_hComm);
        m_hComm = INVALID_HANDLE_VALUE;
    }
}

细心读了一次,如故没察觉标题在这边。然而,又往往商量了一段时间之后,把这些题材想知道了。当把串口数据线拔出之后,串口设施已经在操作系统中不存在,这么些时候却还要去强行关闭串口设备,此时当然会时有暴发尤其,不暴发格外才是不健康的事态。于是,考虑在这一大段代码的外界加一个try…catch…,果不其然,成功捕获到不行,十分代码的值为0x05,代表的意思为ERROR_ACCESS_DENIED,表示拒绝访问。如今操作系统中早就不存在该串口设备,因而驳回访问是例行的图景。最后的代码如下:   

void CleanSerialPort()
{
    try
    {
        if(g_hEvent != NULL)
        {
            CloseHandle(g_hEvent);
            g_hEvent = NULL;
        }

        if(g_SerialPort.IsOpen())
        {
            COMMPROP properties;
            memset(&properties, 0, sizeof(properties));
            g_SerialPort.GetProperties();
            g_SerialPort.ClearWriteBuffer();
            g_SerialPort.ClearReadBuffer();
            g_SerialPort.Flush();
            g_SerialPort.CancelIo();
            g_SerialPort.Close();
        }
    }
    catch(CSerialException &e)
    {
        ATLTRACE("Unexpected CSerialPort exception, Error:%u\n", e.m_dwError);
        UNREFERENCED_PARAMETER(e);
    }
}

抓获到这些那一个之后,在不倒闭应用程序的事态下,不影响再一次开端化串口设备,而应用程序也不报一先河的Runtime
error,因而默许近日的拍卖方案可行。 

相关文章