之所以叫悬而未决,是因为从我第一次见到这个bug,到现在大概已经过了快两年的时间,期间好几次想解决这个问题,但是一直碍于环境和一些技术上的限制,没有解决,直到昨天在一系列的因素作用下,终于解决了这个问题。

还是从头来说说这个bug吧,这个bug在网络上从未见过,一直以来搜索都没有找到有价值的资料,在我心里一直是个幽灵般的存在。

bug的出现是在Windows 7 SP1的系统上安装了一个遗留的VB编写的老系统之后出现的(之所以能确定和这个系统,是和另外一个同事有关,我一直以为只有我能遇到这个幽灵bug,但是他安装了老系统之后也出现了一模一样的问题,从那以后才锁定了bug的元凶,可惜到解决问题也不清楚到底老系统在里面扮演了什么样的角色,导致了这个问题出现)。

最初bug的症状是SQL Server 2008 R2的SSMS(SQL Server Management Studio)出现了无法查询数据的错误(任意选择任意数据库的任意表,在右键菜单中选择“选择前1000行”),当时的感觉就是疥癣之疾,因为不能查询,但是可以编辑(数据表右键菜单中的“编辑前200行”),可以曲线救国达到查询数据的目的,也就没太上心。

直到有一天在查看windows事件日志的时候居然也报这个错误,觉得实在是是可忍孰不可忍,所以开始搜索所有一切和这个问题有关的信息,如前所说,网络上没有太多有价值的信息,当时找到的一篇微软博客上的资料算是最接近的,

Easily Resolving an Event Viewer Error using a Process Memory Dump
http://blogs.msdn.com/b/ntdebugging/archive/2009/02/16/easily-resolving-an-event-viewer-error-using-a-process-memory-dump.aspx

提供的思路是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被解决的更多相关文章

  1. 一个struts2登录bug的解决

    点登录的时候,在url后面总会加上一个;jsessionid=xxx 使找不到页面 的404 Bug ,百思不得其解,最后终于找到解决方案,实验最终成功解决了这个bug,下面是解决方案 1,增加依赖  ...

  2. 用数据集跑一个模型遇到bug如何解决

    自己在用fast rcnn和ssd跑自己数据集过程中都遇到了bug,fast rcnn中是loss下降但值较高,并且测试出来结果一直不对,ssd是loss从一开始到后面loss都一直为0. 遇到这种情 ...

  3. 一个resin启动bug的解决

    这个bug的问题后来被确认为Resin所在目录层有中文目录名.--------------------------------------------------------------------- ...

  4. 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决

    家里路由器不在自己卧室,用树莓派考虑用wifi,之前用Raspberry官方系统,按照教程写的wpa.conf可以连接wifi,后来重新刷ubuntu mate 16.04就不好用了 各种找原因,后来 ...

  5. 一个疑难bug的解决过程

    一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /hom ...

  6. 记录一个前端bug的解决过程

    人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下 ...

  7. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  8. 记一次使用 android 自带 WebView 做富文本编辑器之API、机型的兼容及各种奇葩bug的解决

    转载请声明出处(http://www.cnblogs.com/linguanh/) 目录 1,测试设备介绍 2,开源项目richeditor及CrossWalk的选择 3,遇到的bug及其解决方法 4 ...

  9. ie6,ie7,ie8 css bug兼容解决方法

    IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 这里收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希 ...

随机推荐

  1. 利用PS自动切图、支持svg且支持icoMoon——再也不用四处去转格式了

    今天想导出svg格式的图片支持webFont,结果AI打不开了,文件好像损坏了,于是就想办法在PS里面导出. 网上搜索到一篇文章,腾讯的 http://isux.tencent.com/ps-phot ...

  2. Node.app – 用于 iOS App 开发的 Node.js 解释器

    Node.app 是用于 iOS 开发的 Node.js 解释器,它允许最大的代码重用和快速创新,占用资源很少,为您的移动应用程序提供 Node.js 兼容的 JavaScript API.你的客户甚 ...

  3. linux常见进程与内核线程

    发现大量jdb2进程占用io资源.jdb2进程是一个文件系统的写journal的进程 kthreadd:这种内核线程只有一个,它的作用是管理调度其它的内核线程.它在内核初始化的时候被创建,会循环运行一 ...

  4. Rest(Restful)风格的Web API跟RPC风格的SOAP WebService--这些名词都啥意思?

    经常看到这些词汇,也有baidu或google过,但记忆里总是模糊,不确定,以至于别人问及的时候,总说不清楚.开篇随笔记录下.大家有补充或者意见的尽请留文. 本文顺序: 一.Rest(Restful) ...

  5. Team Foundation Server简介

    对于任何一个软件开发团队而言,成功的一个重要因素在于成员之间.成员与首先使用软件的用户之间有很好的沟通. Team Foundation Server是一个独立的服务器产品,逻辑上,由下列两层组成,这 ...

  6. EntityFramework 6.1.2-beta2

    EntityFramework 6.1.2-beta2 Entity Framework is Microsoft's recommended data access technology for n ...

  7. .net 中读取自定义Config文件

    今天做一个windows插件式服务程序,插件有时要读取配置文件的设置,但是服务是动态加载到服务上的,没有办法作到动态修改服务的配置文件(app.config).在.net 2.0中有一个Configu ...

  8. 循序渐进开发WinForm项目(3)--Winform界面层的项目设计

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  9. 三种对话框的示例(alert,confirm,prompt)

    示例代码 <h2>JavaScriptDialog</h2> <hr/> <buttononclick="btn_alert()"> ...

  10. WPF后台设置xaml控件的样式System.Windows.Style

    WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵   http://3w.suchso.com/projecteac-tual/wpf-zhi ...