利用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.左右对齐 ...
随机推荐
- Linux下编译、安装并启动apache
安装步骤如下: 1. 首先去http://httpd.apache.org/download.cgi上下载需要的apache源码,然后存放至/usr/local/src下[此源码存放路径可任意指定] ...
- 软件项目需求调研中的5W+1H定律案例分析
转:http://www.educity.cn/se/620915.html 对于软件的需求调研活动,虽然曾经写过三篇相关的需求管理文章,出发角度是从整体的需求管理过程考虑:在引入CMM(二)需求管理 ...
- VS编译静态库 .lib 其中Release 版本比Debug版本要大好多原因
如果工程代码使用了: 把此选项关闭即可减少库大小不少:
- node / npm 配置问题
安装nodejs 后运行 npm 命令无响应处理方法 安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件. 再全新安装nodejs ,运行npm 命令,无响应. 处 ...
- 学习Java必看书籍和步骤(转载)
原地址:http://blog.csdn.net/yongjian1092/article/details/7372678 Java语言基础 谈到Java语言基础学习的书籍,大家肯定会推荐Bruce ...
- Python常见函数用法
1. shape()函数 在numpy模块 输入参数:类似数组(比如列表,元组)等,或是数组 返回:一个整型数字的元组,元组中的每个元素表示相应的数组每一维的长度 # shape[0]返回对象的行数, ...
- 如何用keytool导入证书
先用cmd定位到 jre\lib目录下的security文件夹 例如 C:\Program Files\Java\jre1.8.0_191\lib\security 运行cmd,导入证书 keyt ...
- 转 sql注入
1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0<>(selec ...
- Reducing File Size
[Reducing File Size] 1.Unity strips out unused assets. The amount of assets in your project folder d ...
- VUE+WebPack游戏设计:'乘法防线'游戏设计