最近的一个项目中,在客户测试环境(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. Android 4 学习(18):搜索

    参考<Professional Android 4 Development> 搜索 通过下面这几种方式可以给应用程序添加搜索功能: Search Bar Search View Quick ...

  2. RESTFUL 概念

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  3. C#登陆界面学习编写 2018.08.03

    简单的登陆界面的编写,在编写如下界面时,设置错误次数上限需要用到静态变量 public static int count;//计算错误次数(为静态变量) 可以防止点击登陆后次数被清空,在登陆后打开新的 ...

  4. python 文件的读取&更新

    [python 文件的读取&更新] 任务抽象: 读取一个文件, 更新内容后, 重新写入文件. 实际应用: 磁盘上的一个配置文件, 读入内存后为一个dict, 对dict更新后重新写入磁盘. d ...

  5. 理解python中的元类

    一,理解类也是对象 在python中类同样也是一种对象,只要使用关键字class,Python解释器在执行的时候就会创建一个对象,这个对象(类)自身拥有创建对象(类实例)的能力,这就是为什么他是一个类 ...

  6. PHPStorm+XDEBUG 调试Laravel

    首先输出phpinfo(); https://xdebug.org/wizard.php 打开然后查看适合你的调试扩展版本 ,目前支持到php7.2 整个页面ctrl+a  复制进去 然后下载 扩展文 ...

  7. spring4-2-bean配置-3-自动装配

  8. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  9. C#中接口声明属性,但是提示“接口”中不能有属性。

    C#中接口定义属性如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  10. pcl point merge

    http://pointclouds.org/documentation/tutorials/pairwise_incremental_registration.php#pairwise-increm ...