调试信息

可使用如下两个命令输出调试信息:

l Debug.WriteLine()

l Trace.WriteLine()

这两个命令函数的用法几乎完全相同,但有一个重要区别。第一个命令仅在调试模式下运行,而第二个命令还可用于发布程序。实际上,Debug.WriteLine()命令甚至不能编译为可发布的程序。这两个函数包含在System.Diagnostics名称空间中。

这两个函数的第一个字符串参数用于输出消息,而不需要使用{X}语法插入变量值。这意味着必须使用+等串联运算符在字符串种插入变量值。它们还可以有第二个字符串参数,用于显示输出文本的类别。

这些函数的一般输出为: <category>: <message>

这些函数中可使用string.Format()函数把变量值嵌套在字符串种,这比使用+串联运算符更加高效。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics; namespace ConsoleApplication1
{
class Program
{ static void Main(string[] args)
{
int[] testArray = { ,,,,,,,,,,,};
int[] maxValIndices;
int maxNum = GetMax(testArray, out maxValIndices);
Console.WriteLine("The max number in the array is {0},found at element indicies:",maxNum);
foreach (int i in maxValIndices)
{
Console.WriteLine(i);
} Console.ReadLine();
} static int GetMax(int[] nums, out int[] indicies)
{
int iMax = nums[];
int count = ;
indicies = new int[];
indicies[] = ; Debug.WriteLine(string.Format("Maximum value initialized to {0} at element index 0.",iMax)); for (int i = ; i < nums.Length; i++)
{
Debug.WriteLine(string.Format("Now looking at element at index {0}.",i));
if (nums[i] > iMax)
{
iMax = nums[i];
count = ;
indicies = new int[];
indicies[] = i;
Debug.WriteLine(string.Format("New maximum found. New value is {0}, at element index {1}.",iMax,i));
}
else if (nums[i] == iMax)
{
int[] oldIndex = indicies;
count++;
indicies = new int[count];
oldIndex.CopyTo(indicies, );
indicies[count - ] = i;
Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i));
}
}
Trace.WriteLine(string.Format("maximum value {0} found, with {1} occurences.",iMax,count));
Debug.WriteLine("Maximum value search completed.");
return iMax;
} }
}

还有下列命令:

  • Debug.WriteLineIf()
  • Trace.WriteLineIf()
  • Debug.WriteIf()
  • Trace.WriteIf()

这些参数增加了一个必须参数,且该参数放在列表参数的最前面。这个参数的值为布尔值(或者计算结果为布尔值的表达式),只有这个值为true时,函数才会输出文本。使用这些函数可以有条件地把文本输出到Output窗口中。

跟踪点

另一种把信息输出到Output窗口中的方法是使用跟踪点。其作用与使用Debug.WriteLine()相同。它实际上是输出调试信息且不修改代码的一种方式。

方法: 把光标放在要插入跟踪点的代码行上。注意,跟踪点会在执行这行代码之前被处理。如果要输出变量值,应把变量名放在花括号中。

诊断输出与跟踪点

跟踪点与Trace命令并不等价,也就是说,不能使用跟踪点在发布版本中输出信息。这是因为跟踪点并没有包含在应用程序中。跟踪点的主要缺点也是其优点,即他们存储在VS中,因此可以在需要时快速、方便地添加到应用程序中,而且也非常容易删除。其另一个优点是允许方便地添加额外的信息,如$FUNCTION。总之,输出调试信息的两种方法是:

l 诊断输出: 总是要从应用程序中输出调试结果时使用这种方法,尤其是在要输出的字符串比较复杂,涉及几个变量或许多信息的情况下,使用该方法比较好。另外,如果要在发布模式下获得执行应用程序的调试结果,Trace命令常常是唯一的选择。

2 跟踪点: 调试应用程序时,希望快速输出重要信息,以便解决语义错误,应使用跟踪点。

另一个明显的区别是跟踪点只能在VS中使用,而诊断输出可以在VS和VCE中使用。

进入中断模式

  • 在运行应用程序时,单击IDE中的Pause按钮。
  1. 断点。
  2. 在抛出一个未处理的异常时选择进入中断模式。
  3. 生成一个判定语句(assertion)时中断。

判定语句时可以用用户定义的消息中断应用程序的指令。当遇到判定语句时,可以选择Abort,中断应用程序的执行,也可以选择Retry,进入中断模式,还可以选择Ignore,让应用程序像往常一样继续执行。

与调试输出函数一样,判定函数也有两个版本:

  • Debug.Assert()
  • Trace.Assert()

其调试版本也是仅用于编译调试程序。

这两个函数带3个参数。第一个参数是一个布尔值,其值为false会触发判定语句。第二、三个参数是两个字符串,分别把信息写到弹出的对话框和Output窗口中。

Immediate和Command窗口

Command和Immediate窗口可以在运行应用程序的过程中执行命令。通过Command窗口可以手动执行VS操作,Immediate窗口可以执行源代码,计算表达式,还可以执行其他代码。

输入命令immed,可以从Command窗口切换到Immediate窗口;输入>cmd可以从Immediate窗口切换到Command窗口。

Call Stack窗口

Call Stack窗口描述了程序是如何执行到当前位置的。

结构化异常处理(Structured Exception Handling, SEH)

如果有一个或多个catch块,finally块就是可选的,否则就是必须的。

可以使用表达式throw; 在catch块中抛出异常。这个表达式会再次抛出catch块处理过的异常。如果以这种方式抛出异常,该异常就不会由当前的try...catch...finally快处理,而是由上一级的代码处理。

C#代码示例_调试的更多相关文章

  1. C#代码示例_定义类

    默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它.可以使用internal访问修饰符关键字显示指定. 除了两个访问修饰符关键字(public, internal)外,还可以指定类是抽象的( ...

  2. C#代码示例_函数

    参数数组 C#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组.参数数组可以使用个数不定的参数调用函数,可以使用params关键字定义它们. 参数数组 ...

  3. C#代码示例_集合

    C#中数组实现为System.Array类得实例,它们只是集合类(Collection Classes)中的一种类型. 索引符(indexer)是一种特殊类型的属性,可以把它添加到一个类中,以提供类似 ...

  4. C# 代码示例_结构/数组/枚举...

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  6. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  7. 2018-12-09 疑似bug_中文代码示例之Programming in Scala笔记第九十章

    续前文: 中文代码示例之Programming in Scala笔记第七八章 源文档库: program-in-chinese/Programming_in_Scala_study_notes_zh ...

  8. 2018-11-27 中文代码示例之Programming in Scala笔记第七八章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...

  9. 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...

随机推荐

  1. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sort ...

  2. Java 中的 static 使用之静态方法

    与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法.其实之前我们一直写的 main 方法就是静态方法.静态方法的使用如: 运行结果: 需要注意: 1. 静态方法中可以直接调用 ...

  3. js插入动态脚本

    原文章:https://www.w3cmm.com/dom/insert-javascript.html 动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本.和操作HTM ...

  4. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

  5. 使用Github管理项目代码的版本

    作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. 在Git中并不存在主库这样的概 ...

  6. (八)open函数的flag详解

    3.1.4.open函数的flag详解13.1.4.1.读写权限:O_RDONLY O_WRONLY O_RDWR(1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明(譬 ...

  7. MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件.  上一节中创建了一个名为"A ...

  8. json对象,数组,字符串总结

    关于json对象,数组,字符串的总结 什么是json? JSON(JavaScript Object Notation)  一种轻量级的数据交换格式,JSON采用完全独立于语言的文本格式...(来自百 ...

  9. Http-Only Cookie

    设置Cookie的时候,如果服务器加上了HttpOnly属性,则这个Cookie无法被JavaScript读取(即document.cookie不会返回这个Cookie的值),只用于向服务器发送. S ...

  10. 快速排序,C语言实现

    排序法里比较出名的,具体的算法看下图: 这篇博客说的通俗易懂:http://blog.csdn.net/morewindows/article/details/6684558 这是快速排序的基础,用代 ...