前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VS 2022调试技巧:远程调试、线程检查、性能检查

VS 2022调试技巧:远程调试、线程检查、性能检查

作者头像
郑子铭
发布2023-08-30 08:23:25
1.2K0
发布2023-08-30 08:23:25
举报
文章被收录于专栏:DotNet NB && CloudNative

前言

visual studio一直都是.net/c#开发人员最受欢迎的编译器,除了强大的代码提示和项目模板,还拥有大量的调试工具,这一期我们介绍下code freeze阶段的一些调试技巧。包括测试环境/生产环境下的远程调试,线程调试,以及性能监控调试。

一、远程调试

当我们的程序所在的目标机器没有跑源码所需的sdk或者没办法安装vs的时候,我们需要对目标机器上正在运行或者即将运行的应用进行调试。我们通过远程调试在本机上对目标机器调试。

1、安装

Remote Debug下载地址:

https://visualstudio.microsoft.com/zh-hans/downloads/?rr=https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging?view=vs-2019

选择下载进行安装,最后管理员运行。

查看目标机运行所使用的端口号

2、调试

1、调试->附加进程

修改对应的目标主机的端口和IP地址

2、选中对应的进程点击附加

3、我们贴上一段代码,代码会死循环打印一个自增的数

代码语言:javascript
复制
static void Main(string[] args)
{
    int i = 0;
    while (true) 
    {
        Console.WriteLine(++i);
        Thread.Sleep(1000);
    }
}

我们在目标主机运行起来,然后在本地利用源码进行远程调试,并且加上一个断点。

发现断点进来了,并且程序不再打印,则调试成功。

二、线程调试

我们可以利用visual studio的线程窗口来查看目前所有的活动线程的运行情况以及线程目前在代码何处运行。

该功能配合远程调试可以很好的观察生产或者测试环境下的死锁问题。当然开发环境下也一样。

我们来调查一个死锁。

先实现一个简单的死锁程序:声明两个锁对象,并且用两个线程各自占用一个锁,再去索要另外一个锁,形成死锁。

代码语言:javascript
复制
private static object _lock = new object();
private static object _lock_1 = new object();
static void Main(string[] args)
{
    var task1 = Task.Run(DeadLock);
    var task2 = Task.Run(DeadLock_1);

    Task.WaitAll(task1,task2);
    Console.WriteLine("Hello, World!");
}

private static void DeadLock()
{
    lock (_lock)
    {
        Thread.Sleep(200);
        lock (_lock_1)
        {
            Console.WriteLine("DeadLock");
        }
    }
}

private static void DeadLock_1()
{
    lock (_lock_1)
    {
        Thread.Sleep(200);
        lock (_lock)
        {
            Console.WriteLine("DeadLock_1");
        }
    }
}

运行程序之后,将程序中断

点击调试->窗口->线程

可以看到两个工作线程,双击可以查看该线程中断时所处的位置。从而可以分析线程是否阻塞在这里,是否是形成问题的关键。

三、性能调试

VS自带的性能监控工具提供了一些数据的监控和分析,比较常用的就是CPU使用和内存IO的监控。它支持本地启动项目的监控以及进程和可执行程序的附加。

点击调试->性能追踪(Performance Profiler)

我们来实现一个CPU密集型的代码

代码语言:javascript
复制
static async Task Main(string[] args)
{
    await MultiRunning();
    SomeThing();
    Console.WriteLine("Hello, World!");
}

//启动20个线程
static async Task MultiRunning()
{
    Thread[] tasks = new Thread[20];
    foreach (var index in Enumerable.Range(0, tasks.Length))
    {
        tasks[index] = new Thread(() =>
        {
            while (true)
            {
                int a = 1;
                Thread.Sleep(200);
            }
        });
    }

    int i = 0;
    await Parallel.ForEachAsync(tasks, (task, source) =>
    {
        i++;
        task.Start();
        return ValueTask.CompletedTask;
    });

    Console.WriteLine("执行了" + i);
}

static void SomeThing()
{
    while (true)
    {
        Console.WriteLine("I AM Alive");
        Thread.Sleep(200);
    }
}

我们使用Performance Profiler对启动项目的CPU进行监控。

当我们觉得程序运行的差不多了,我们可以点击停止搜集,然后visual studio会给我们生成一些分析数据

点击打开详情,然后根据函数来分析占用的CPU,默认也是按照函数所占用的CPU时间片来进行排序。选择我们程序的函数,双击Main函数,可以看到里面的方法各自的占用,从而判断找出高CPU的函数。

以此类推,如果需要寻找高IO的根源点,也可以使用VS自带的Performace Profiler来追踪代码的执行性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2、调试
  • 二、线程调试
  • 三、性能调试
相关产品与服务
远程调试
远程调试(Remote Debugging,RD)在云端为用户提供上千台真实手机/定制机/模拟器设备,快速实现随时随地测试。运用云测技术对测试方式、操作体验进行了优化,具备多样性的测试能力,包括随时截图和记录调试日志,稳定的支持自动化测试, 设备灵活调度,用例高效执行, 快速定位产品功能和兼容性问题。云手机帮助应用、移动游戏快速发现和解决问题,节省百万硬件费用,加速敏捷研发流程。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档