最近花了差不多1天的时间在折腾一个Bug,该Bug的表象如下:

这个Bug还特别独特,在开发电脑中无提示,在终端用户那里每次使用软件的时候都报这个。仔细思考了一下最近在源码中新添加的功能,没发现有啥特别明显的问题。于是,根据字面意思的理解是“运行时错误”,所以一开始解决这个问题的思路是将所有应用程序的运行时拷贝至应用程序目录。尝试过之后,依然报这个异常。分析可能跟运行时的动态链接库没有关系。于是,调整解决问题的思路,考虑将工程中新添加的代码进行分割。部分部分的测试新添加的代码到底那里有问题,排查到最后是这个函数内部发生了异常。异常函数的代码如下:

void CleanSerialPort()
{
if(g_hEvent != NULL)
{
CloseHandle(g_hEvent);
g_hEvent = NULL;
} if(g_SerialPort.IsOpen())
{
COMMPROP properties;
memset(&properties, , sizeof(properties));
g_SerialPort.GetProperties();
g_SerialPort.ClearWriteBuffer();
g_SerialPort.ClearReadBuffer();
g_SerialPort.Flush();
g_SerialPort.CancelIo();
g_SerialPort.Close();
}
}

一开始仔细读了几遍代码,没发现有啥异常的地方。在这个时候,只能通过一点一点调试编译器来最终确定问题在那里。调试编译器的方式比较传统,是通过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, , 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,因此默认目前的处理方案可行。

记一次调试串口设备Bug的经历的更多相关文章

  1. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  2. 记一次bug查找经历

    系统采用cell插件显示汇总数据,然后发现个公司数据显示不出来,接到这个任务开始查找bug. 通过需求了解并不知道其他公司什么情况,因为就这个公司有了反馈: 本来以为很容易找到点的,毕竟数据显示不出来 ...

  3. 记一次诡异的bug调试——————关于JDK1.7和JDK1.8中HashSet的hash(key)算法的区别

    现象: 测试提了一个bug,我完全复现不了,但是最吊诡的是在其他人的机器上都可以复现.起初以为是SVN合并后出现的冲突,后来经过对比法排查: step 1: 我本地开两个jetty,一个跑合并之前的版 ...

  4. UWP 记一次x64平台无法单步调试的bug

    是这样的,平时开发uwp程序,都是用x86架构进行部署和调试.但是有时候需要在XBOX上进行调试,所以架构需要改成x64进行操作. 但是最近x64位下不能进行调试了. 搜遍网上的各种教程,也是各有各的 ...

  5. 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:http://www.cnblogs.com/linguanh/) 前序: 距离  2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...

  6. 转载:Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

    转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致…按下F12;还是熟悉的味道;  或者直接 Ctrl ...

  7. bug:记最近出现的非功能bug

    1.android 4.1.2 的兼容bug 一直以为Android 测试 4 5 6就可以了,结果发现Android4.1.2 和Android4.3之间还是有差距的. 处理办法:验证版本兼容的时候 ...

  8. Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

    转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致-按下F12;还是熟悉的味道;  或者直接 Ctrl ...

  9. 记一次内存溢出的分析经历——thrift带给我的痛orz

    说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...

随机推荐

  1. bzoj1798 [Ahoi2009]维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  2. uoj#228 基础数据结构练习题

    题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...

  3. Apache localhost和局域网ip地址访问

    今天忍无可忍重装了公司的电脑,所以把开发工具也都重新装一下. 安装wamp,localhost和局域网ip地址无法访问. 在C:\Windows\System32\drivers\etc\hosts文 ...

  4. redis-key相关命令

    本篇主要介绍和redis的key进行操作的相关命令. 命令 描述 复杂度 返回值 DEL key [key ...] 删除给定的一个或多个 key .不存在的 key 会被忽略.删除单个列表.集合.有 ...

  5. Maven学习-构建项目

    创建项目 运行如下命令会创建一个简单的Maven项目. mvn archetype:create -DgroupId=com.netease.learn -DartifactId=simple -Dp ...

  6. 最常用的缓存技术---redis入门

      Redis简介 Redis是基于内存,也可以基于磁盘持久化nosql数据库,使用c语言开发. 数据存储结构:key-value 安装环境准备 Redis使用c语言开发,需要使用gcc编译程序进行编 ...

  7. angular.js的时间指令

    最后样式 html .input-group(style="max-width:150px") input.form-control(uib-datepicker-popup=&q ...

  8. 《高性能javascript》 --- in case of odd number of items(奇怪的条目的数量)

    不知道是做着故意放的还是什么原因.总之运行后就会出现问题(奇怪的条目的数量) function merge(left, right){ var result = []; while (left.len ...

  9. 用C语言模仿Python函数

    首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度 ...

  10. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...