• C#代码示例_调试


    调试信息

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

    l Debug.WriteLine()

    l Trace.WriteLine()

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

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

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

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

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Diagnostics;
     7 
     8 namespace ConsoleApplication1
     9 {
    10     class Program
    11     {
    12 
    13 
    14         static void Main(string[] args)
    15         {
    16             int[] testArray = { 4,7,4,2,7,3,7,8,3,9,1,9};
    17             int[] maxValIndices;
    18             int maxNum = GetMax(testArray, out maxValIndices);
    19             Console.WriteLine("The max number in the array is {0},found at element indicies:",maxNum);
    20             foreach (int i in maxValIndices)
    21             {
    22                 Console.WriteLine(i);
    23             }
    24 
    25             Console.ReadLine();
    26         }
    27 
    28         static int GetMax(int[] nums, out int[] indicies)
    29         {
    30             int iMax = nums[0];
    31             int count = 1;
    32             indicies = new int[1];
    33             indicies[0] = 0;
    34 
    35             Debug.WriteLine(string.Format("Maximum value initialized to {0} at element index 0.",iMax));           
    36 
    37             for (int i = 1; i < nums.Length; i++)
    38             {
    39                 Debug.WriteLine(string.Format("Now looking at element at index {0}.",i));
    40                 if (nums[i] > iMax)
    41                 {
    42                     iMax = nums[i];
    43                     count = 1;
    44                     indicies = new int[1];
    45                     indicies[0] = i;
    46                     Debug.WriteLine(string.Format("New maximum found. New value is {0}, at element index {1}.",iMax,i));
    47                 }
    48                 else if (nums[i] == iMax)
    49                 {
    50                     int[] oldIndex = indicies;
    51                     count++;
    52                     indicies = new int[count];
    53                     oldIndex.CopyTo(indicies, 0);
    54                     indicies[count - 1] = i;
    55                     Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i));
    56                 }
    57             }
    58             Trace.WriteLine(string.Format("maximum value {0} found, with {1} occurences.",iMax,count));
    59             Debug.WriteLine("Maximum value search completed.");
    60             return iMax;
    61         }
    62 
    63     }
    64 }

     

    还有下列命令:

    • 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快处理,而是由上一级的代码处理。

     

  • 相关阅读:
    UnicodeEncodeError: 'latin-1' codec can't encode character 'u7801' in position 49: Body ('码') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8. 请求body里面有 汉字
    pytest-allure清空上一次运行的记录(--clean-alluredir)用例重复显示
    【DPDK】谈谈DPDK如何实现bypass内核的原理 其二 DPDK部分的实现
    【DPDK】谈谈DPDK如何实现bypass内核的原理 其一 PCI设备与UIO驱动
    【Network telemetry】谈谈网络遥感技术,从主动探测与被动探测再到Netflow与INT
    【DPDK】【ring】从DPDK的ring来看x86无锁队列的实现
    【DPDK】【Multiprocess】一个dpdk多进程场景的坑
    【DPDK】【CPU usage】DPDK应用如何计算当前系统的压力
    Kubernetes client-go Informer 源码分析
    Kubernetes Job Controller 原理和源码分析(二)
  • 原文地址:https://www.cnblogs.com/anything-but-ordinary/p/3538193.html
Copyright © 2020-2023  润新知