c#

位置:IT落伍者 >> c# >> 浏览文章

怎样在Visual C# .NET 中跟蹤和调试(1)


发布日期:2022年10月09日
 
怎样在Visual C# .NET 中跟蹤和调试(1)

本文介绍如何使用 Debug

当程序运行时您可以使用 Debug 类的方法来生成消息以帮助您监视程序执行顺序检测故障或提供性能度量信息默认情况下Debug 类产生的消息显示在 Visual Studio 集成开发环境 (IDE) 的输出窗口中

该代码示例使用 WriteLine 方法生成后面带有行结束符的消息当您使用此方法生成消息时每条消息在输出窗口中均显示为单独的一行

使用 Debug 类创建一个示例

启动 Visual Studio NET

新建一个名为 conInfo 的新 Visual C# NET 控制台应用程序项目将创建 Class

在 Class 的顶部添加以下名称空间

using SystemDiagnostics;

要初始化变量以使其包含产品的相关信息请将下面的声明语句添加到 Main 方法

string sProdName = Widget;

int iUnitQty = ;

double dUnitCost = ;

(就在上面代码后面)直接输入将类生成的消息指定为 WriteLine 方法的第一个输入参数按 CTRL+ALT+O 组合键以确保输出窗口可见

DebugWriteLine(Debug InformationProduct Starting );

为了清晰易读请使用 Indent 方法在输出窗口中缩进后面的消息

DebugIndent();

要显示所选变量的内容请使用 WriteLine 方法如下所示

DebugWriteLine(The product name is + sProdName);

DebugWriteLine(The available units on hand are + iUnitQtyToString());

DebugWriteLine(The per unit cost is + dUnitCostToString());

您还可以使用 WriteLine 方法显示现有对象的名称空间和类名称例如下面的代码在输出窗口中显示 SystemXmlXmlDocument 命名空间

SystemXmlXmlDocument oxml = new SystemXmlXmlDocument();

DebugWriteLine(oxml);

要整理输出可以包括一个类别作为 WriteLine 方法的第二个可选的输入参数如果您指定一个类别输出窗口消息的格式为类别:消息例如以下代码的第一行在输出窗口中显示Field:The product name is Widget

DebugWriteLine(The product name is + sProdNameField);

DebugWriteLine(The units on hand are + iUnitQtyField);

DebugWriteLine(The per unit cost is + dUnitCostToString()Field);

DebugWriteLine(Total Cost is + (iUnitQty * dUnitCost)Calc);

仅在使用 Debug 类的 WriteLineIf 方法将指定条件计算为 true 时输出窗口才可以显示消息将要计算的条件是 WriteLineIf 方法的第一个输入参数WriteLineIf 的第二个参数是仅在第一个参数的条件计算为真时才显示的消息

DebugWriteLineIf(iUnitQty > This message WILL appear);

DebugWriteLineIf(iUnitQty < This message will NOT appear);

使用 Debug 类的 Assert 方法使输出窗口仅在指定条件计算为 false 时才显示消息

DebugAssert(dUnitCost > Message will NOT appear);

DebugAssert(dUnitCost < Message will appear since dUnitcost < is false);

控制台窗口 (tr) 和名为 Outputtxt (tr) 的文本文件创建 TextWriterTraceListener 对象然后将每个对象添加到 Debug Listeners 集合中

TextWriterTraceListener tr = new TextWriterTraceListener(SystemConsoleOut);

DebugListenersAdd(tr);

TextWriterTraceListener tr = new TextWriterTraceListener(SystemIOFileCreateText(Outputtxt));

DebugListenersAdd(tr);

为了清晰易读请使用 Unindent 方法去除 Debug 类为后续消息生成的缩进当您将 Indent 和 Unindent 两种方法一起使用时读取器可以将输出分成组

DebugUnindent();

DebugWriteLine(Debug InformationProduct Ending);

为了确保每个 Listener 对象收到它的所有输出请为 Debug 类缓沖区调用 Flush 方法

DebugFlush();

使用 Trace 类

您还可以使用 Trace 类生成监视应用程序执行的消息Trace 和 Debug 类共享大多数相同的方法来生成输出这些方法包括

◆WriteLine

◆WriteLineIf

◆Indent

◆Unindent

◆Assert

◆Flush

您可以在同一应用程序中分别或同时使用 Trace 和 Debug 类在一个调试解决方案配置项目中Trace 和 Debug 两种输出均为活动状态该项目从这两个类为 Listener 对象生成输出但是发布解决方案配置项目仅从 Trace 类生成输出发布解决方案配置项目忽略任何 Debug 类方法调用

TraceWriteLine(Trace InformationProduct Starting ); TraceIndent(); TraceWriteLine(The product name is +sProdName); TraceWriteLine(The product name is+sProdNameField ); TraceWriteLineIf(iUnitQty > This message WILL appear); TraceAssert(dUnitCost > Message will NOT appear); TraceUnindent(); TraceWriteLine(Trace InformationProduct Ending); TraceFlush(); ConsoleReadLine();

确认它可以使用

确保 Debug 是当前的解决方案配置

如果解决方案资源管理器窗口不可见请按 CTRL+ALT+L 组合键以显示此窗口

右键单击conInfo然后单击属性

在 conInfo 属性页左窗格中配置文件夹下请确保箭头指向调试

配置文件夹上面的配置下拉列表框中单击活动(调试)调试然后单击确定

按 CTRL+ALT+O 以显示输出窗口

按 F 键以运行该代码在出现断言失败对话框时单击忽略

控制台窗口中按 ENTER 键此时程序即已完成输出窗口应显示以下输出

Debug InformationProduct StartingThe product name is WidgetThe available units on hand areThe per unit cost is SystemXmlXmlDocumentField: The product name is WidgetField: The units on hand areField: The per unit cost isCalc: Total Cost is This message WILL appear DEBUG ASSERTION FAILED Assert Short Message Message will appear since dUnitcost < is false Assert Long Message at ClassMain(String[] args) \classcs()The product name is WidgetThe available units on hand areThe per unit cost is Debug InformationProduct EndingTrace InformationProduct StartingThe product name is WidgetField: The product name isWidgetThis message WILL appearTrace InformationProduct Ending

控制台窗口和 Outputtxt 文件应显示以下输出

The product name is WidgetThe available units on hand are The per unit cost is Debug InformationProduct EndingTrace InformationProduct StartingThe product name is WidgetField: The product name is WidgetThis message WILL appearTrace InformationProduct Ending

注意Outputtxt 文件与 conInfo 可执行文件 (conInfoexe) 位于同一目录中通常情况下该目录是存储项目源的 \bin 文件夹默认情况下为 C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin

完整代码列表

using System; using SystemDiagnostics; class Class{[STAThread]static void Main(string[] args){string sProdName = Widget; int iUnitQty = ; double dUnitCost = ; DebugWriteLine(Debug InformationProduct Starting ); DebugIndent(); DebugWriteLine(The product name is +sProdName); DebugWriteLine(The available units on hand are+iUnitQtyToString()); DebugWriteLine(The per unit cost is + dUnitCostToString()); SystemXmlXmlDocument oxml = new SystemXmlXmlDocument(); DebugWriteLine(oxml); DebugWriteLine(The product name is +sProdNameField); DebugWriteLine(The units on hand are+iUnitQtyField); DebugWriteLine(The per unit cost is+dUnitCostToString()Field); DebugWriteLine(Total Cost is +(iUnitQty * dUnitCost)Calc); DebugWriteLineIf(iUnitQty > This message WILL appear); DebugWriteLineIf(iUnitQty < This message will NOT appear); DebugAssert(dUnitCost > Message will NOT appear); DebugAssert(dUnitCost < Message will appear since dUnitcost < is false); TextWriterTraceListener tr = new TextWriterTraceListener(SystemConsoleOut); DebugListenersAdd(tr); TextWriterTraceListener tr = new TextWriterTraceListener(SystemIOFileCreateText(Outputtxt)); DebugListenersAdd(tr); DebugWriteLine(The product name is +sProdName); DebugWriteLine(The available units on hand are+iUnitQty); DebugWriteLine(The per unit cost is +dUnitCost); DebugUnindent(); DebugWriteLine(Debug InformationProduct Ending); DebugFlush(); TraceWriteLine(Trace InformationProduct Starting ); TraceIndent(); TraceWriteLine(The product name is +sProdName); TraceWriteLine(The product name is+sProdNameField ); TraceWriteLineIf(iUnitQty > This message WILL appear); TraceAssert(dUnitCost > Message will NOT appear); TraceUnindent(); TraceWriteLine(Trace InformationProduct Ending); TraceFlush(); ConsoleReadLine(); }}

注意要使此代码示例发挥作用必须通过将 using SystemDiagnostics; 粘贴为第一行代码来添加 SystemDiagonstics 名称空间

               

上一篇:在Hadoop上用C#编程

下一篇:.NET中三层构架开发实例-用户注册系统