记一次调试串口设备Bug的经历
最近花了差不多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的经历的更多相关文章
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
- 记一次bug查找经历
系统采用cell插件显示汇总数据,然后发现个公司数据显示不出来,接到这个任务开始查找bug. 通过需求了解并不知道其他公司什么情况,因为就这个公司有了反馈: 本来以为很容易找到点的,毕竟数据显示不出来 ...
- 记一次诡异的bug调试——————关于JDK1.7和JDK1.8中HashSet的hash(key)算法的区别
现象: 测试提了一个bug,我完全复现不了,但是最吊诡的是在其他人的机器上都可以复现.起初以为是SVN合并后出现的冲突,后来经过对比法排查: step 1: 我本地开两个jetty,一个跑合并之前的版 ...
- UWP 记一次x64平台无法单步调试的bug
是这样的,平时开发uwp程序,都是用x86架构进行部署和调试.但是有时候需要在XBOX上进行调试,所以架构需要改成x64进行操作. 但是最近x64位下不能进行调试了. 搜遍网上的各种教程,也是各有各的 ...
- 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮
(出处:http://www.cnblogs.com/linguanh/) 前序: 距离 2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...
- 转载:Chrome调试折腾记_(1)调试控制中心快捷键详解!!!
转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致…按下F12;还是熟悉的味道; 或者直接 Ctrl ...
- bug:记最近出现的非功能bug
1.android 4.1.2 的兼容bug 一直以为Android 测试 4 5 6就可以了,结果发现Android4.1.2 和Android4.3之间还是有差距的. 处理办法:验证版本兼容的时候 ...
- Chrome调试折腾记_(1)调试控制中心快捷键详解!!!
转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致-按下F12;还是熟悉的味道; 或者直接 Ctrl ...
- 记一次内存溢出的分析经历——thrift带给我的痛orz
说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...
随机推荐
- python——文件操作
open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式 ...
- Java多线程中的单例模式
一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { private static cla ...
- SVD之最小二乘【推导与证明】
0.SLAM中SVD进行最小二乘的应用 在SLAM应用中,计算Homography Matrix,Fundamental Matrix,以及做三角化(Triangulation)时,都会用到最小二乘 ...
- OC比C中,新增的数据类型
布尔型 BOOL 以及 boolean 1)这两者都是判断类型 2)在C底层这两者都是一个 char类型 占一个字符大小 3)BOOL 的取值为 YES / NO 其中NO =0 YES =1 4)b ...
- Alsa 读取wave文件,并播放wave 文件
对于一个wave文件,如果需要播放,涉及到几个方面 1.对于wave文件的解析 2.通过解析wave文件,将得到的参数(主要是sampfrequency, bitsperSample,channel) ...
- Centos6.5安装memcached
1.检查libevent 首先检查系统中是否安装了libevent(Memcache用到了libevent这个库用于Socket的处理). # rpm -q libevent libevent-1.4 ...
- jQuery选择器的分类
jQuery选择器的分类 jQuery中有很多分类,大类分为四类,四类里面又分为很多小类,下面就为大家一一介绍,这些选择器的使用和好处,Me用的是jQuery1.8.3的版本 选择器都有哪四类?? 1 ...
- jqPaginator 项目中做分页的应用技巧
最近做后台管理系统,分页用到的不少,项目中其实已经有分页功能的组件但是不够高度自定义,于是就找到了 jqPaginator 高度自定义的Html结构 初始化引用如下: $("#paginat ...
- Mysql 忘记root密码后修改root密码
1.修改my.cnf: 在mysqld进程配置文件中添加skip-grant-tables,添加完成后记住保存. 2.重新启动MYSQL数据库: service mysqld restart 2.修改 ...
- opencv探索之路(十二):感兴趣区域ROI和logo添加技术
在图像处理领域,有一个非常重要的名词ROI. 什么是ROI? 它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域. 感兴趣区域,就是我们从图像中选择一个图像区域,这个区域 ...