又一个悬而未决的bug被解决
之所以叫悬而未决,是因为从我第一次见到这个bug,到现在大概已经过了快两年的时间,期间好几次想解决这个问题,但是一直碍于环境和一些技术上的限制,没有解决,直到昨天在一系列的因素作用下,终于解决了这个问题。
还是从头来说说这个bug吧,这个bug在网络上从未见过,一直以来搜索都没有找到有价值的资料,在我心里一直是个幽灵般的存在。
bug的出现是在Windows 7 SP1的系统上安装了一个遗留的VB编写的老系统之后出现的(之所以能确定和这个系统,是和另外一个同事有关,我一直以为只有我能遇到这个幽灵bug,但是他安装了老系统之后也出现了一模一样的问题,从那以后才锁定了bug的元凶,可惜到解决问题也不清楚到底老系统在里面扮演了什么样的角色,导致了这个问题出现)。
最初bug的症状是SQL Server 2008 R2的SSMS(SQL Server Management Studio)出现了无法查询数据的错误(任意选择任意数据库的任意表,在右键菜单中选择“选择前1000行”),当时的感觉就是疥癣之疾,因为不能查询,但是可以编辑(数据表右键菜单中的“编辑前200行”),可以曲线救国达到查询数据的目的,也就没太上心。


直到有一天在查看windows事件日志的时候居然也报这个错误,觉得实在是是可忍孰不可忍,所以开始搜索所有一切和这个问题有关的信息,如前所说,网络上没有太多有价值的信息,当时找到的一篇微软博客上的资料算是最接近的,
提供的思路是dump出内存转储进行分析,虽然我对分析内存转储并不熟,但是当时抱着学习的想法就照着这个思路去做,结果去dump SSMS的内存转储,结果又提示没有权限,当时的感觉是天塌地陷,没路可走了,于是又开始了好长一段时间不再管它。
后来就是另外一个同事确定了bug的元凶,但是这对解决问题并没太帮助,那次又花了几个小时去尝试解决这个问题,可惜还是无功而返。
说了这么久,再来聊聊这个bug本身,从一直以来的分析和函数堆栈可以得知是在DateTime格式化的时候出的问题,
简单的说就是这样一行代码会抛出FormatException:String str = DateTime.Now.ToString();
但是这个问题并不会在我们自己的项目中出现,当时我一直没注意这一点,直到解决这个问题之后才想到这也是一个点。
最后还是回到如何解决这个问题上来吧,昨天晚上机缘巧合看到了这个:
可在广域网部署运行的QQ高仿版 -- GGTalk总览
http://www.cnblogs.com/justnow/p/3382160.html
然后就下载了源代码,想编译看看,结果如大家所想的那样,我又碰上了这个问题,不过这次是在有源代码的情况下还碰上这个问题,我的牛劲又上来了,还就不相信了,有源代码还揪不出来你个小样
于是我跟踪了代码,最终确定了的确是在上面那行代码上出问题,有人也许会问难道这么久你在自己的项目都没碰到过这个问题么,的确,我也这么写过,但还真没碰到过,为什么?
原来出问题的.NET Framework是2.0版本,我试了4.0版本,即使在有问题的计算机上也不会出现这个异常,猜测是4.0的代码中加入异常处理,如果有异常抛出的话会格式化成默认的格式。

确定了问题之后也解决不了啊,不是在自己的代码出的问题,这下就看出开源的好处了,微软不是公开了.NET Framework的代码么,咱上代码看!
细节就不多说了,可惜的是现在直接看不到2.0的代码,就拿4.6.1的来看了,想着这些基本类库里面的改动应该不会特别大,希望能有帮助
跟踪的过程也不细说了,直到看到下面这个属性终于找到对解决问题有帮助的内容(其实在之前就怀疑和区域的时间设置有关系,不过因为平时做这方面的工作不多,对类库不熟)
public static DateTimeFormatInfo CurrentInfo {
get {
Contract.Ensures(Contract.Result<DateTimeFormatInfo>() != null);
System.Globalization.CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;
if (!culture.m_isInherited) {
DateTimeFormatInfo info = culture.dateTimeInfo;
if (info != null) {
return info;
}
}
return (DateTimeFormatInfo)culture.GetFormat(typeof(DateTimeFormatInfo));
}
}
接下来就是查看出问题的程序的区域文化信息,终于找到问题的根源,不知道为什么FullDateTimePattern等几个属性的值居然有乱码,但是在系统的区域属性当中查看却是没有乱码的(也许是系统自行处理这些异常?)

知道了问题根源,怎么解决也就不那么困难了,到系统的区域设置当中重置自定义格式,之后世界清静了,呼!
又一个悬而未决的bug被解决的更多相关文章
- 一个struts2登录bug的解决
点登录的时候,在url后面总会加上一个;jsessionid=xxx 使找不到页面 的404 Bug ,百思不得其解,最后终于找到解决方案,实验最终成功解决了这个bug,下面是解决方案 1,增加依赖 ...
- 用数据集跑一个模型遇到bug如何解决
自己在用fast rcnn和ssd跑自己数据集过程中都遇到了bug,fast rcnn中是loss下降但值较高,并且测试出来结果一直不对,ssd是loss从一开始到后面loss都一直为0. 遇到这种情 ...
- 一个resin启动bug的解决
这个bug的问题后来被确认为Resin所在目录层有中文目录名.--------------------------------------------------------------------- ...
- 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决
家里路由器不在自己卧室,用树莓派考虑用wifi,之前用Raspberry官方系统,按照教程写的wpa.conf可以连接wifi,后来重新刷ubuntu mate 16.04就不好用了 各种找原因,后来 ...
- 一个疑难bug的解决过程
一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /hom ...
- 记录一个前端bug的解决过程
人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下 ...
- android一个下拉放大库bug的解决过程及思考
android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...
- 记一次使用 android 自带 WebView 做富文本编辑器之API、机型的兼容及各种奇葩bug的解决
转载请声明出处(http://www.cnblogs.com/linguanh/) 目录 1,测试设备介绍 2,开源项目richeditor及CrossWalk的选择 3,遇到的bug及其解决方法 4 ...
- ie6,ie7,ie8 css bug兼容解决方法
IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 这里收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希 ...
随机推荐
- 开放产品开发(OPD):开篇
OPD?这是什么玩意?google一下.忘记说了,最近google被封锁的厉害,那就百度一下吧.可惜,OPD找不出是什么.你今天你找不到是正常的,因为之前还没有OPD,而现在才开始有OPD这个东东.相 ...
- web面试题大全
$HTML, HTTP,web综合问题 常见排序算法的时间复杂度,空间复杂度 前端需要注意哪些SEO web开发中会话跟踪的方法有哪些 <img>的title和alt有什么区别 docty ...
- Event事件跨浏览器封装
var Event = { //注册事件 addEvent: function(element,type,handler){ if(element.addEventListener){ //DOM2级 ...
- Android 中 Handler 引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下.http://w ...
- 以对象的方式来访问xml数据表(二)
为什么要以对象的方式来访问xml数据表? 还记得,自己是在一次完成师兄布置的任务时接触到了xml,那时候需要用xml来作为数据文件,保存一个简单的图书管理系统的数据.于是就知道了,可以用xml文件来保 ...
- POJ 1681---Painter's Problem(高斯消元)
POJ 1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...
- spring注解配置启动过程
最近看起spring源码,突然想知道没有web.xml的配置,spring是怎么通过一个继承于AbstractAnnotationConfigDispatcherServletInitializer的 ...
- PHP Warning: Module 'modulename' already loaded in Unknown on line 0
问题 当在命令行运行PHP的CLI版本时,您可能会收到类似以下错误: [root@myserver /root]$ php -v PHP Warning: Module 'pcre' already ...
- 设计模式总结篇系列:命令模式(Command)
在程序设计中,经常会遇到一个对象需要调用另外一个对象的某个方法以达到某种目的,在此场景中,存在两个角色:请求发出者和请求接收者.发出者发出请求,接收者接收请求并进行相应处理.有时候,当需要对请求发出者 ...
- PowerBuilder反编译
最近需要了解某个PowerBuilder程序如何工作的,这已经是某个时代的产物了.除了EXE之外,还有一些PBD文件.PBD文件是PowerBuilder动态库,作为本地DLL的一个替 ...