最近的一个项目中,在客户测试环境(UAT)发现了一个bug,却反复尝试都无法在开发环境和QA环境来重现。界面上也没有出现任何异常和错误,只是某个数据的显示错误,其他数据都正常。仔细分析和调试了出错位置的上下文代码,没有任何异常和疑点。由于是C/S结构(WPF),而技术人员也无法到达客户现场进行协助,所以半天都没有任何进展。

后来突然想到了用Trace.WriteLine输出日志的方法,在征得领导同意和取得客户的协助意愿之后,按下面的步骤来实施,最终根据日志分析找到了问题原因:

  1. 在出现bug的相关上下文代码中加入Trace.WriteLine方法,记录下可疑的数据和状态;
  2. 新建一个单独的dll工程,里面要求实现接口TraceListener,重写WriteLine(或者Write)方法;
  3. 将生成的dll拷贝到系统启动目录下(与启动exe文件平级);
  4. 修改系统配置文件(app.config),将输出节点配置为刚才dll中的TraceListener实现类;
  5. 重新制作安装包分发给客户(或者让程序自动更新);
  6. 让客户重新运行新版本程序,并重现一次bug;
  7. 让客户把指定位置下的日志文件发送过来进行分析。

配置文件相关节点如下:

<system.diagnostics>
<trace>
<listeners>
<add name="SimpleLogTraceListener" type="TraceListenerApp.SimpleTraceListener, TraceListenerApp"/>
</listeners>
</trace>
</system.diagnostics>

输出日志的实现类代码如下:

    /// <summary>
/// A simple implementation for TraceListener to log the output to text file
/// </summary>
public class SimpleTraceListener : TraceListener
{
//default trace log file path
string filepath = @"c:\temp\tracelog.txt";
/// <summary>
/// override the output from Trace.Write()
/// </summary>
/// <param name="message"></param>
public override void Write(string message)
{
CheckLogFile();
//format the message with datetime
StringBuilder sb = new StringBuilder();
sb.Append("[");
sb.Append(DateTime.Now.ToString());
sb.Append("]\t");
sb.Append(message);
using (StreamWriter sw = new StreamWriter(filepath, true))
{
sw.Write(sb.ToString());
sw.Flush();
}
} /// <summary>
/// override the output from Trace.WriteLine()
/// </summary>
/// <param name="message"></param>
public override void WriteLine(string message)
{
CheckLogFile();
//format the message with datetime
StringBuilder sb = new StringBuilder();
sb.Append("[");
sb.Append(DateTime.Now.ToString());
sb.Append("]\t");
sb.Append(message);
using (StreamWriter sw = new StreamWriter(filepath, true))
{
sw.WriteLine(sb.ToString());
sw.Flush();
}
} //make sure the logfile is existing, if not, create a new one.
void CheckLogFile()
{
if (!File.Exists(filepath))
{
try
{
FileStream fs = File.Create(filepath);
fs.Close();
}
catch (Exception ex)
{
throw ex;
}
}
}
}

(完)

利用Trace.WriteLine定位难以重现的问题的更多相关文章

  1. 如何重现难以重现的bug

    生活中有这么一种现象:如果你关注某些东西,它就会经常出现在你眼前,例如一个不出名的歌手的名字,一种动物的卡通形象,某个非常专业的术语,等等等等.这种现象也叫做“孕妇效应”.还有类似的一种效应叫做“视网 ...

  2. C# 调试之 Debug.WriteLine()、Trace.WriteLine()

    Trace 类 和 Debug 类的区别在于,Trace 类会同时在 Debug.Release 模式下起作用,而 Debug 只作用在 Debug 模式下. 区别: 1. 输出跟踪信息 Trace. ...

  3. 利用 Traceview 精准定位启动时间测试的异常方法 (工具开源)

    机智的防爬虫标识原创博客地址:http://www.cnblogs.com/alexkn/p/7095855.html博客求关注: http://www.cnblogs.com/alexkn 1.启动 ...

  4. 如何利用火焰图定位 Java 的 CPU 性能问题

     常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...

  5. 利用flash精确定位asp.net的图像热点区域

    Asp.net的热点区域控件非常有用,但是对于热点区域如何精确定位,设定矩形,圆和多边形要素点的位置,用flash能够精确定位,在flash中制作热点区域的部分,可以是矩形,图形或者文字,然后对于这部 ...

  6. editplus利用正则表达式快速定位

    例如我要找到user_jj表保存数据的语句 做法:editplus选择正则表达式输入 user_jj.*save 就可以定位到:M('user_jj')->where(array('tgbz_i ...

  7. iOS - (利用/调用系统定位获取当前经纬度与地理信息)

    这些天做iOS项目的时候,需要通过定位来拿到当期城市的名称.百度地图SDK有这个功能,但为了不依赖第三方,这里使用iOS自带框架CoreLocation来实现这个需求.iOS8出来之后,针对定位需要多 ...

  8. 利用jstack命令定位占用cpu高的java线程及具体错误代码信息

    1.先用top查询某进程的线程CPU占用情况,定位到cpu占用高的进程pid 2.根据pid定位具体的线程top -p PID -H ,找出占用cpu最大的pid,此处占用cpu比较平均,我们随便选择 ...

  9. HTML利用posotion属性定位 小技巧

    1.居中效果 父级DIV (index-top )属性设置为 text-align:center; 子级DIV( tabIndex-main)属性设置为 margin:0 auto;   2.左右对齐 ...

随机推荐

  1. TCP粘包拆包场景

    TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...

  2. 软件项目需求调研中的5W+1H定律案例分析

    转:http://www.educity.cn/se/620915.html 对于软件的需求调研活动,虽然曾经写过三篇相关的需求管理文章,出发角度是从整体的需求管理过程考虑:在引入CMM(二)需求管理 ...

  3. elasticsearch 安装 head插件

    head插件 切换到Elasticsearch的安装目录 cd ~/demo/elasticsearch/es1 执行安装命令 [root@localhost es1]# bin/plugin ins ...

  4. AspectJ的通知类型

  5. Uniform & Attribute & Varying

    [Uniform & Attribute & Varying] 顶点着色器的输入变量用关键字“attribute”来限定. 片段着色器的输入变量(它和顶点着色器的输出变量相对应)用关键 ...

  6. java求最长公共子串的长度

    1这道题目就是给定两个字符串,然后求这两个字符串的最长公共子串的最大长度,假设我的f()方法是来求两个字符串的最大公共子串,从头开始逐一比较,如果相等,则 继续调用这个方法,使得递归的长度+1,如果不 ...

  7. EntityFramework - Code First - 数据迁移

    需求 在更新模型之后同步更新数据库里的表,并不丢失原有数据 使用默认值填充新增加的字段 EntityFramework迁移命令 Enable-Migrations 启用迁移 Add-Migration ...

  8. Idea2017常用功能

    1,添加java工程  2,导出可执行jar 3,本地代码提交svn新分支 4,乱码问题解决 一次解决所有问题,只需做配置文件的修改即可 解决方案:       在 IntelliJ IDEA 201 ...

  9. Selenium模拟浏览器初识

    Seleniumd介绍 在写Python爬虫的时候,最麻烦的不是那些海量的静态网站,而是那些通过JavaScript获取数据的站点.Python本身对js的支持不好,所以就有良心的开发者来做贡献了,这 ...

  10. python操作mysql数据库系列-安装MySQLdb

    一波三折,先是pip命令出现问题,然后各种方法尝试解决.然后是直接使用pip2命令安装报错,mysql-python库安装再次出现问题.于是使用国内镜像的方式去安装:pip2 install MySQ ...