CNET中国旗舰网站
ZDNet China
|
CNET科技资讯网
|
政府采购
|
行业网站联盟
ZDNet China 至顶网是中国最大的企业级IT资源门户
首页
网络安全
存储
服务器
软件
桌面产品
开发
企业管理
白皮书
中小企业
新闻
下载
社区
企业网
无线网
过滤防护
安全管理
网络存储
磁带库/VTL
数据保护
光存储
X86服务器
虚拟化
小型机
操作系统
数据库
中间件
协作办公
手机
笔记本
数码相机
C/S开发
web开发
移动开发
web软件
应用软件
博客
论坛
搜索
搜索
高级搜索
用户登录
用户名:
密码:
登录
新用户注册
社区首页
未证实消息
桌面产品
软件
开发
网络与安全
服务器
存储
下载
苹果爱好者
中小企业
活动专区
病毒/木马
新知天下
CWEEK专属社区
悬赏问答
游客:
注册
|
登录
|
会员
|
搜索
|
论坛设施
|
帮助
ZDNetChina中文社区
»
.Net技术
» .NET下一种简单的调试诊断方法
C++开发常用工具荟萃
深入理解C语言指针的奥秘
Vista系统解惑要考虑的10件事
Asp.Net 学习资源列表
J2ME与Web Service的罗曼史
中间件技术的思想、概念、分类
.Net开发人员十种必备工具
用JSP 2.0开发Web应用程序
草根挑战豪门PHPer要为自己正名
高手写的php+flash多人视频聊天室
PHP程序员的优化调试技术和技巧
PHP程序员的优化调试技术和技巧
‹‹ 上一主题
|
下一主题 ››
投票
交易
悬赏
活动
打印
|
推荐
|
订阅
|
收藏
标题:
[分享]
.NET下一种简单的调试诊断方法
builder0
明星会员
UID 254236
精华
4
积分 24910
帖子 2061
威望 11854
ZD币 3059 元
阅读权限 230
注册 2007-10-11
状态 离线
楼主
使用道具
发表于 2007-10-11 10:55
资料
个人空间
短消息
加为好友
开发者在线
.NET下一种简单的调试诊断方法
在.NET下,我们可以借助于Debug和Trace类对程序的执行过程进行跟踪、断点、调试、日志记录等,从而可以快速定位和排除程序故障。同时.Net提供的几个TraceListener类可以方便灵活的让我们选择信息的输出方式:日志文件,事件日志等等,但有的时候我们需要实时跟踪调试信息的输出,就像IDE的调试窗口输出,或者类似HTTPWATCH的输出。比如我们在窗体上放一个Text控件,希望通过这个控件实时查看调试信息的输出。那么能否将Debug和Trace类的输出定向到这个控件中呢?答案是肯定的,通过继承TraceLister类来实现,下面的代码将调试信息输出到RichTextBox中:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Windows.Forms;
namespace
MyTraceListenerTesting
{
class
MyTraceListener:TraceListener
{
private
RichTextBox _richTextBox
=
null
;
public
MyTraceListener(RichTextBox richTextBox)
{
this
._richTextBox
=
richTextBox;
this
.NeedIndent
=
true
;
}
private
delegate
void
WriteDelegate(
string
message);
private
void
WriteImpl(
string
message)
{
if
(
this
.NeedIndent)
{
this
.WriteIndent();
this
.NeedIndent
=
true
;
}
this
._richTextBox.AppendText(message);
this
._richTextBox.Select(
this
._richTextBox.Text.Length,
0
);
this
._richTextBox.ScrollToCaret();
}
public
override
void
Write(
string
message)
{
//
This is for thread safety
this
._richTextBox.Invoke(
new
WriteDelegate(
this
.WriteImpl),
new
object
[]
{ message }
);
}
public
override
void
WriteLine(
string
message)
{
this
.Write(message
+
Environment.NewLine);
}
}
}
热点频道推荐:
C/S开发
|
数据库
|
WEB开发
|
嵌入式
|
项目管理
|
builder0
明星会员
UID 254236
精华
4
积分 24910
帖子 2061
威望 11854
ZD币 3059 元
阅读权限 230
注册 2007-10-11
状态 离线
沙发
使用道具
发表于 2007-10-11 10:56
资料
个人空间
短消息
加为好友
通过上述代码可以看出,其实实现自定义的TraceLister是非常方便的,我们可以方便的根据自己的需要将日志信息输出到不同的目标位置。
测试程序如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Diagnostics;
namespace
MyTraceListenerTesting
{
public
partial
class
Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
void
f1()
{
int
id
=
System.Threading.Thread.CurrentThread.ManagedThreadId;
Debug.WriteLine(
"
Enter f1 by thread
"
+
id.ToString());
Debug.Indent();
this
.f2();
Debug.Unindent();
Debug.WriteLine(
"
Leave f1 by thread
"
+
id.ToString());
}
private
void
f2()
{
int
id
=
System.Threading.Thread.CurrentThread.ManagedThreadId;
Debug.WriteLine(
"
Enter f1 by thread
"
+
id.ToString());
Debug.Indent();
for
(
int
i
=
0
; i
<
100
; i
++
)
{
Debug.WriteLine(
"
Working inside step
"
+
i.ToString()
+
"
by thread
"
+
id.ToString());
System.Threading.Thread.Sleep(
20
);
}
Debug.Unindent();
Debug.WriteLine(
"
Leave f1 by thread
"
+
id.ToString());
}
private
void
button1_Click(
object
sender, EventArgs e)
{
this
.f1();
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
Debug.Listeners.Add(
new
MyTraceListener(
this
.richTextBox1));
}
}
}
热点频道推荐:
C/S开发
|
数据库
|
WEB开发
|
嵌入式
|
项目管理
|
builder0
明星会员
UID 254236
精华
4
积分 24910
帖子 2061
威望 11854
ZD币 3059 元
阅读权限 230
注册 2007-10-11
状态 离线
板凳
使用道具
发表于 2007-10-11 10:56
资料
个人空间
短消息
加为好友
目前从其它线程单独调用Debug.WriteLine是没有问题的,可以正确的将信息写入界面线程的控件中,但是当多个线程同时调用Debug.WriteLine的时候,会出现死锁现象,关于TraceListener的线程安全如何处理目前还不是很清楚,需要进一步完善。
这篇文章的产生基于这样的原因:一个程序因为过于庞大复杂,需要详细记录日志以便于操作,开始的时候采用了EnterpriseLibrary,效果确实好,非常方便,但后来提出程序可能要向PDA平台迁移,因此果断舍弃EnterpriseLibrary,决定采用其他方法,经过一番考察后决定采用系统自带的Debug类和Trace类,遗憾的是Trace类只提供了Assert方法,就是说在Release版本中是无法记录调试信息的,只有在DEBUG模式下面上述代码才能生效,但作为一个折中,基本上是满足项目要求了。
热点频道推荐:
C/S开发
|
数据库
|
WEB开发
|
嵌入式
|
项目管理
|
投票
交易
悬赏
活动
控制面板首页
编辑个人资料
积分交易
公众用户组
好友列表
个人空间管理
开通个人空间
基本概况
流量统计
客户软件
发帖量记录
论坛排行
主题排行
发帖排行
积分排行
在线时间
管理团队
管理统计
问卷调查
操作系统
数据库
中间件
应用软件
管理软件
Web应用
AJAX
Linux
Web2.0
RIA
开源
SOA
OSS
SEO
Vista
SharePoint
Windows Server
Windows 2003
Windows 2008
IIS
动态语言
Windows
IE7
Oracle
Oracle11g
office
SQLServer
Firefox
Solaris
Ubuntut
微软
Google
资讯
博客
技术看板
英雄
图片
QQ
腾讯QQ
珊瑚虫QQ
金山上市
站点图
AJAX
BI
BPM
CRM
DNS
Android
SQL Server 2008
EAI
Enterprise 2.0
ETL
ERP
Flash
GPL3
Java
j2me
JavaEE
LAMP
mashups
NTFS
ODBC
ODF
OOP
Outsourcing
RIA
RSS
SOA
UML
Web2.0
Workflow
XAML
XML
ZFS
备份
并发控制
并行计算
动态语言
多核计算
虚拟技术
CRM
数据仓库
虚拟化
Apollo
Apache
BizTalk
DB2
Eclipse
Excel
Expression
Flex3
Fedora7
Forefront
FreeBSD
Hibernate
IE 7
IIS
JavaFX
JBoss
Linspire
live
Maxthon
Mobile 6.0
Mozilla
MySQL
office
OneCare
OpenOffice
Solaris
Oracle
Oracle 11g