又一个悬而未决的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以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希 ...
随机推荐
- Direct3D11学习:(六)渲染管线
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 这篇文章主要讲解渲染管线(rendering pipeline)的理论知识. 渲染管线是指:在给定一个3D场景的 ...
- Websocket协议的学习、调研和实现
本文章同时发在 cpper.info. 1. websocket是什么 Websocket是html5提出的一个协议规范,参考rfc6455. websocket约定了一个通信的规范,通过一个握手的机 ...
- Parameter配置文件获取
public class ConfigInfo { public static ParametersHelper Parameters { get { return new ParametersHel ...
- mysql 在row模式下truncate 与 delete 二进制日志记录的差异
二进行日志的格式为row mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_nam ...
- asp.net Get和Post传参和接收参数
asp.netGet和Post传参和接收参数 Get请求: 对于传参:test.aspx?name=%e5%bc%a0%e4%b8%89 接收参数的方法: Request.QueryString[&q ...
- kfreebsd不适用于实际环境
debian搞的kfreebsd,其中有很多常用的软件包处于依赖破损的状态,个人觉得是无法用作日常开发或生产环境的. 当然,对于只使用其中几项完整可用功能的场景,基本上还是可以的. 当时看个这个东东的 ...
- [python学习笔记]Day3
函数 如: def is_leapyear(year): if (year%4 == 0 and year%100 != 0) or (year%400 == 0): return True else ...
- 股票投资组合-前进优化方法(Walk forward optimization)
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- Genymotion Shell命令
命令行选项 •-h 输出帮助信息 •-r ip_address 连接到特定Genymotion虚拟设备 •-c "command" 在原生shell环境中执行给定命令而后返回 •- ...
- 硅谷新闻1--引导界面GuideActivity
1.红点切换间距 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_red_point.getLayoutPa ...