在好例子网,分享、交流、成长!
<<

C# 入门教程(常用工具- 2.VS调试)

代码调试是指通过运行程序并观察其执行过程,以解决程序中的错误和问题。

举一个生活中常见的例子,比如手机无法上网了,我们要排查原因,

  • 调:重启路由器,试:检查是不是有网络问题,
  • 调:打开流量管理,试:检查流量是不是超了
  • 调:打开其它软件是否正常,试:检查是软件问题还是手机问题
  • 。。。。。

这个逐步解决问题的过程就是调试。

graph LR
N[Visual Studio调试] --> O[打印调试]
N --> PA[日志记录]
N --> P[断点调试]

打印调试

在关键代码段中插入打印语句,输出变量的值或特定的提示信息,以便跟踪程序的执行路径和检查变量的状态。这是最简单直接的调试方法,常用于定位问题的具体位置和变量的取值情况。

适用场景:主要用于能在控制台运行的程序,例如:控制台应用、.net core 项目、asp.net core 、asp.net core api等项目。

以下是一个完整的可运行示例代码,演示如何在 C# 中进行打印调试:

using System;

class Program
{
    static void Main(string[] args)
    {
        int x = 5;
        int y = 10;
        int result = AddNumbers(x, y);

        Console.WriteLine("计算结果为: " + result);
    }

    static int AddNumbers(int a, int b)
    {
        // 打印调试
        Console.WriteLine("正在相加的数字: " + a + " + " + b);

        int sum = a + b;

        // 打印调试
        Console.WriteLine("求和结果为: " + sum);

        return sum;
    }
}

在上面的示例代码中,我们定义了一个简单的函数 AddNumbers,它接收两个整数参数并返回它们的和。在 Main 函数中,我们声明了两个变量 xy,并将它们作为参数传递给 AddNumbers 函数,最后将返回的结果打印出来。

为了进行打印调试,我们在 AddNumbers 函数中使用了 Console.WriteLine 函数来输出一些调试信息。我们在两个关键位置使用了打印语句,分别打印正在相加的数字和它们的和。这样可以在运行程序时观察到这些调试信息,以便跟踪程序的执行路径并检查变量的状态。

日志记录

在程序中添加日志输出,将关键信息记录到日志文件中,包括各种状态、错误信息、变量值等。通过分析日志,可以了解程序的执行流程,并追踪问题的来源。

适用场景:几乎适用全部应用程序。

以下是一个完整的可运行示例代码,演示如何在 C# 中进行日志记录调试:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string logFilePath = "debug_log.txt";

        // 打开或创建日志文件
        using (StreamWriter writer = new StreamWriter(logFilePath, true))
        {
            int x = 5;
            int y = 10;
            int result = AddNumbers(x, y);

            // 将调试信息写入日志文件
            writer.WriteLine("正在计算:{0} + {1}", x, y);
            writer.WriteLine("计算结果为:{0}", result);
        }

        // 读取日志文件,并打印出日志内容
        using (StreamReader reader = new StreamReader(logFilePath))
        {
            string line;
            Console.WriteLine("日志内容:");
            while ((line = reader.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }

        Console.WriteLine("日志记录完成。");
    }

    static int AddNumbers(int a, int b)
    {
        int sum = a + b;

        return sum;
    }
}

在上面的示例代码中,我们首先定义了一个字符串变量 logFilePath,用于指定日志文件的路径。然后,在 Main 函数中,我们使用 StreamWriter 类打开或创建一个日志文件,并以追加方式写入日志。

AddNumbers 函数中,我们执行相加操作,并将结果返回给调用者。

在主程序的适当位置,我们使用 writer.WriteLine 将调试信息写入日志文件。这里我们记录了正在计算的两个数字以及它们的和。

最后,我们在控制台输出 "日志记录完成" 的消息,表示日志记录过程已经结束。

你可以尝试运行这段代码,并查看生成的日志文件。每次运行程序时,它都会将调试信息追加到现有的日志文件中。这样就可以在日后查看日志文件,以便了解程序的执行过程和变量的状态。

C#中常用的日志记录类库有很多,以下是一些常见的日志记录类库:

  1. NLog:功能强大且灵活的日志记录库,支持多种日志目标和输出格式,易于配置和扩展。
  2. log4net:一个成熟的开源日志记录库,提供可配置的日志记录器和多种输出适配器,支持灵活的日志级别和格式化选项。
  3. Serilog:一个简单而灵活的日志库,具有更现代化的 API 设计和结构化日志记录能力,并支持多种输出源和格式。
  4. Microsoft.Extensions.Logging: .NET Core 官方的日志记录接口和实现,提供了通用的日志记录功能,可以与各种日志记录库进行集成。
  5. Enterprise Library Logging:微软的企业库(Enterprise Library)中包含了一个日志记录组件,提供了一套灵活的日志记录功能。

以上是一些常见的日志记录类库,它们都有其特点和使用场景。选择哪个日志记录类库取决于项目需求、个人偏好以及开发团队的使用经验等因素。

断点调试

使用调试器工具,在程序中设置断点,当程序执行到断点处时会暂停执行,可以逐行查看代码的执行过程、变量的值以及栈的状态。可以单步执行代码,同时观察变量的变化,帮助发现潜在的问题。

适用场景:几乎适用全部应用程序。

首先设置断点 设置断点

开始调试代码 调试过程

以下是一个简单的 C# 断点调试的入门级完整可运行示例,用于演示如何在 Visual Studio 中设置断点并观察程序的执行过程:

using System;

namespace DebuggingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 5;
            int y = 7;
            int result = AddNumbers(x, y);
            if (result == 12)
            {
                Console.WriteLine("计算正确");
            }
            else 
            {
                Console.WriteLine("计算错误");
            }
            
        }

        static int AddNumbers(int a, int b)
        {
            int sum = a + b;
            return sum;
        }
    }
}

这个示例程序包含 Main 方法和一个辅助方法 AddNumbersMain 方法中创建了两个整数变量 xy,然后调用 AddNumbers 方法来计算它们的和,并将结果输出到控制台。

要进行断点调试,请按照以下步骤操作:

  1. 打开 Visual Studio,并创建一个新的控制台应用程序项目。
  2. 将上述代码复制到项目的 Program.cs 文件中。
  3. AddNumbers 方法的第一行或任意感兴趣的代码行上设置断点。可以通过单击行号旁边的空白处或按下 F9 键来设置断点。
  4. 按下 F5 键或点击工具栏上的“开始调试”按钮启动调试会话。
  5. 程序会在设置断点的位置暂停执行。此时,可以观察变量的值、执行顺序以及其他调试信息。
  6. 通过使用调试工具栏上的“继续”按钮、单步执行按钮或逐过程执行按钮,逐步执行代码并观察变量的变化。
  7. 调试会话结束后,可以查看最终的输出结果。

通过这个示例,你可以学习如何在 Visual Studio 中设置断点、启动调试会话,并观察程序的执行过程。你可以尝试在不同位置设置断点,以及使用调试工具栏上的其他功能来深入了解代码的执行。

在 Visual Studio 中,调试器提供了一些常用的调试功能,包括逐语句、逐过程和跳出。下面我将详细解释每个功能的作用和如何使用它们。

  1. 逐语句(Debugging Step by Step):这是最基本的调试功能之一,允许你逐条执行代码并观察变量的值以及程序的执行路径。逐语句调试功能可以帮助你理解程序的执行流程,找到代码中的错误或潜在问题。

    • 使用方法:在断点处启动调试会话后,点击调试工具栏上的"单步执行(Step Into)"按钮或按下F11键进行逐语句调试。每次点击一次,程序就会执行一条语句,并在下一行代码暂停。
  2. 逐过程(Debugging Step over):逐过程调试功能可用于跳过当前方法的执行,而无需单步执行其中的每一条语句。这对于你只关心方法的结果而不关心内部细节的情况很有用。

    • 使用方法:在断点处启动调试会话后,点击调试工具栏上的"步过(Step Over)"按钮或按下F10键进行逐过程调试。程序会执行当前方法的所有语句,并在返回到调用方法的位置后暂停。
  3. 跳出(Debugging Step out):跳出调试功能允许你跳过当前方法的剩余代码并直接返回到调用该方法的位置。这对于当你已经进入了一个复杂的方法,但实际上只对方法的返回值感兴趣时很有用。

    • 使用方法:在断点处启动调试会话后,点击调试工具栏上的"跳出(Step Out)"按钮或按下Shift + F11键进行跳出调试。程序会继续执行当前方法的剩余代码,并在返回到调用方法的位置后暂停。

除了上述的三种常用调试功能外,Visual Studio 还提供了其他一些调试工具,例如条件断点、监视窗口、自动变量窗口等。这些工具能够帮助你更好地理解和诊断代码中的问题。

在 Visual Studio 中,即时窗口(Immediate Window)是一个交互式的工具,可以让你在调试会话期间执行一些简单的代码和表达式,并立即查看结果。它提供了一个实验性的环境,可以帮助你更好地理解和调试代码。

以下是即时窗口的一些主要功能:

  1. 执行表达式:你可以在即时窗口中输入表达式,例如数学计算、字符串操作或者方法调用,并立即查看表达式的结果。这对于在调试过程中验证特定表达式是否返回了期望的值很有用。

  2. 调试对象:在即时窗口中,你可以评估和检查当前正在调试的对象的属性和方法。只需输入对象的名称,然后使用点运算符(.)访问对象的成员。这样可以快速查看和理解对象的内部结构。

  3. 修改变量值:在即时窗口中,你可以直接修改当前调试过程中的变量的值。这对于在调试期间尝试不同的值以查找问题原因或进行实验性的更改很有用。

  4. 调用方法:除了检查对象的属性和方法外,你还可以在即时窗口中直接调用方法。这对于在调试过程中测试某个特定方法的行为或验证某个特定操作的结果很有用。

  5. 调试命令:即时窗口还支持一些特殊的调试命令,可以帮助你执行一些额外的操作。例如,你可以使用 $output 命令将输出重定向到即时窗口,或者使用 $exception 命令查看当前的异常信息。

通过将代码片段和表达式直接输入到即时窗口,你可以快速验证、检查和修改代码,而无需编写和运行额外的测试代码。它是一个强大而灵活的工具,可以在调试期间提供实时的反馈和探索能力。

总结起来,逐语句调试可以逐行执行代码并观察变量的变化;逐过程调试可以跳过当前方法的执行;跳出调试可以直接返回到调用方法的位置。通过使用这些调试功能,你可以更加深入地理解代码的执行过程,找到潜在的问题并进行修复。

小结

其实生活中,我们也在通过不断的调整,不断的尝试,从而更快达成目标。

大家有任何问题都可以加关注后在评论区留言,或者加客服一对一咨询。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

报警