利用Trace.WriteLine定位难以重现的问题
最近的一个项目中,在客户测试环境(UAT)发现了一个bug,却反复尝试都无法在开发环境和QA环境来重现。界面上也没有出现任何异常和错误,只是某个数据的显示错误,其他数据都正常。仔细分析和调试了出错位置的上下文代码,没有任何异常和疑点。由于是C/S结构(WPF),而技术人员也无法到达客户现场进行协助,所以半天都没有任何进展。
后来突然想到了用Trace.WriteLine输出日志的方法,在征得领导同意和取得客户的协助意愿之后,按下面的步骤来实施,最终根据日志分析找到了问题原因:
- 在出现bug的相关上下文代码中加入Trace.WriteLine方法,记录下可疑的数据和状态;
- 新建一个单独的dll工程,里面要求实现接口TraceListener,重写WriteLine(或者Write)方法;
- 将生成的dll拷贝到系统启动目录下(与启动exe文件平级);
- 修改系统配置文件(app.config),将输出节点配置为刚才dll中的TraceListener实现类;
- 重新制作安装包分发给客户(或者让程序自动更新);
- 让客户重新运行新版本程序,并重现一次bug;
- 让客户把指定位置下的日志文件发送过来进行分析。
配置文件相关节点如下:
<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定位难以重现的问题的更多相关文章
- 如何重现难以重现的bug
生活中有这么一种现象:如果你关注某些东西,它就会经常出现在你眼前,例如一个不出名的歌手的名字,一种动物的卡通形象,某个非常专业的术语,等等等等.这种现象也叫做“孕妇效应”.还有类似的一种效应叫做“视网 ...
- C# 调试之 Debug.WriteLine()、Trace.WriteLine()
Trace 类 和 Debug 类的区别在于,Trace 类会同时在 Debug.Release 模式下起作用,而 Debug 只作用在 Debug 模式下. 区别: 1. 输出跟踪信息 Trace. ...
- 利用 Traceview 精准定位启动时间测试的异常方法 (工具开源)
机智的防爬虫标识原创博客地址:http://www.cnblogs.com/alexkn/p/7095855.html博客求关注: http://www.cnblogs.com/alexkn 1.启动 ...
- 如何利用火焰图定位 Java 的 CPU 性能问题
常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...
- 利用flash精确定位asp.net的图像热点区域
Asp.net的热点区域控件非常有用,但是对于热点区域如何精确定位,设定矩形,圆和多边形要素点的位置,用flash能够精确定位,在flash中制作热点区域的部分,可以是矩形,图形或者文字,然后对于这部 ...
- editplus利用正则表达式快速定位
例如我要找到user_jj表保存数据的语句 做法:editplus选择正则表达式输入 user_jj.*save 就可以定位到:M('user_jj')->where(array('tgbz_i ...
- iOS - (利用/调用系统定位获取当前经纬度与地理信息)
这些天做iOS项目的时候,需要通过定位来拿到当期城市的名称.百度地图SDK有这个功能,但为了不依赖第三方,这里使用iOS自带框架CoreLocation来实现这个需求.iOS8出来之后,针对定位需要多 ...
- 利用jstack命令定位占用cpu高的java线程及具体错误代码信息
1.先用top查询某进程的线程CPU占用情况,定位到cpu占用高的进程pid 2.根据pid定位具体的线程top -p PID -H ,找出占用cpu最大的pid,此处占用cpu比较平均,我们随便选择 ...
- HTML利用posotion属性定位 小技巧
1.居中效果 父级DIV (index-top )属性设置为 text-align:center; 子级DIV( tabIndex-main)属性设置为 margin:0 auto; 2.左右对齐 ...
随机推荐
- ubuntu下安装stm32开发环境
在windowns下开发stm32刚开始学最烦的就是创建工程模板,都不知道为什么要那样设置,而且步骤繁多.现在我告诉大家一个好消息,在linux下配置stm32开发环境包括创建工程,使用JLink仿真 ...
- Linux配置Oracle 11g自动启动
http://www.cnblogs.com/edwardcmh/archive/2012/05/11/2495671.html 安装完毕Oracle 11g每次都得手动启动 | 停止数据库(dbst ...
- 基于 DirectX11 的 MMDViewer 04-渲染目标视图和多视口
上篇文章给出了一个简单并且可以运行的渲染框架,接下来将介绍框架中的渲染管线构成. 1.创建渲染管线 在你创建完一个窗口后,接着便要创建渲染管线,使用的函数是 D3D11CreateDeviceAndS ...
- Windows Intel VT-x开启
解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题 背景:win7 旗舰版 64位+VMware 10.0 启动虚拟机时报错 问题:已将该虚拟机 ...
- shell脚本里切换用户执行命令的注意事项
功能说明:用root用户执行一个脚本,脚本里需要切换到普通用户DT去执行其他命令,其中就用到了EOF,用法如下: #!/bin/bash su - DT<<EOF cd apache-to ...
- Linux实战教学笔记53:开源虚拟化KVM(一)搭建部署与概述
一,KVM概述 1.1 虚拟化概述 在计算机技术中,虚拟化意味着创建设备或资源的虚拟版本,如服务器,存储设备,网络或者操作系统等等 [x] 虚拟化技术分类: 系统虚拟化(我们主要讨论的反向) 存储虚拟 ...
- Slim安装以及使用【转】
最近在用backbone.js 做东西,因为牵扯到REST services 所以需要后台支持,此处选择了php.Slim 是php的一个框架. 貌似国内文章对此的介绍比较少,在安装Slim的过程中出 ...
- windows系统mysql-5.7.19官方绿色版zip包安装教程
环境: 系统环境 Windows 10 64位 mysql版本 5.7.19 一.万变不离的下载 下载页面:https://dev.mysql.com/downloads/mysql/ 点击 Down ...
- Python 2.7 爬取51job 全国java岗位
一页有50条数据一共2000页 分页是get分页 #!/usr/bin/python # encoding: utf-8 import requests import threading from ...
- 为什么要使用href=”javascript:void(0);”
为什么要使用href=”javascript:void(0);” href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,而void( ...