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

🏆作者:科技、互联网行业优质创作者
🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!

前言

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、我们贴上一段代码,代码会死循环打印一个自增的数

static void Main(string[] args)
{
    int i = 0;
    while (true) 
    {
        Console.WriteLine(++i);
        Thread.Sleep(1000);
    }
}

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

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

图片

二、线程调试

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

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

我们来调查一个死锁。

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

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密集型的代码

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来追踪代码的执行性能。

🏆欢迎订阅我的专栏(.NET/C#中大型项目开发),里面有很多高价值技术文章,能助你涨薪+升职!让你快速成长为相关领域的架构师、领航员。也能让普通中小企业轻松享有大型互联网分布式系统解决方案。
🏆同时,专栏(.NET/C#中大型项目开发)的内容也能教你采用最简单的方式开发.NET/C#中大型应用——理清技术脉络、形成思维体系、获取最佳实践、框架开发能力。让你具备挑战百万年薪的基础,逐渐成为国内一流.NET/C#从业者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

总交易量突破 3000 亿美元,APX Finance 成本轮牛市最大的黑马?

“APX Finance 总交易量现已突破 3000 亿美元,已然成为链上衍生品赛道的主力军” 自 2021 年链上衍生品市场进入萌芽期以来,该板块始终保持着较高的市场增速,即便如此该领域仍旧存在极大的发展空间。一方面,衍生品板块交易量目前占…

微信小程序发布遇到的一些问题记录

1.报错组件没有按需导入 在该路径配置微信小程序添加"lazyCodeLoading" : "requiredComponents" "mp-weixin" : { "appid" : "你的appid", "setting" : { "urlCheck" : f…

工业设备联网监控

在当今这个工业4.0和智能制造蓬勃发展的时代,如何对工业设备进行高效、智能的联网监控,已经成为众多企业关注的焦点。HiWoo Cloud平台以其卓越的联网监控能力和创新的技术应用,正成为更多企业的选择。今天,我们就来详细探讨一下Hi…

如何制作Peppol文件?

Peppol (Pan-European Public Procurement Online) 是一种用于跨境电子采购的标准协议和网络。它允许企业和政府机构以电子方式交换文件,如电子发票、订单和发货单。如果你需要制作Peppol文件,可以参考如下步骤: 准备必要工具和资源 1.Pepp…

STC设计与RTX51--RTX51操作系统

知不足而奋进 望远山而前行 目录 文章目录 前言 内容 操作系统 我们认知的操作系统 最小的操作系统 RTX51系统 RTX51 Real-Time Kernel RTX51 Tiny环境搭建 库函数与RTX51 RTX51的延时问题 K_TMO与K_IVL的区别 K_SIG信号等待 总结 前言 理解操作系统功能学会使用…

Docker搭建redis-cluster集群

1. 前期准备 1.1 拉redis镜像 docker search redis docker pull redis1. 2 创建网卡 docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡 docker network inspect myredisdocker network rm myredis #删除网卡命令 多个中间 空格隔开 docker network --h…

排序数组 ---- 分治-快排

题目链接 题目: 分析: 回顾一下快速排序, 快速排序的思想就是找一个基准值key, 按照基准值, 将数组分成两块, 分别是<key和>key的区域,然后继续对这两个区域划分, 那么快速排序的时间复杂度是O(N*logN), 但是如果数组中有许多相同的元素, 如果我们选定的基准值就有相同…

补上缺失的一环----一种数据库系统主动对外推送表的增删改实时变动数据的实践

在实践中&#xff0c;一些应用程序或模块需要实时获取某些数据库表的增删改变动数据。 对此需求&#xff0c;常见的方案有: 1、应用程序通过轮循查询数据库方式获取数据库表的增删改变动数据. 2、应用程序在把数据写入数据库表之前&#xff0c;通过事件方式向外通知数据库表的增…

【HarmonyOS】应用振动效果实现

一、问题背景&#xff1a; 应用在强提醒场景下&#xff0c;一般会有马达振动的效果&#xff0c;提示用户注意力的关注。 比如消息提醒&#xff0c;扫码提示&#xff0c;删除键确认提示等。 针对高定制化或者固定的振动方式&#xff0c;我们需要有不同的方案实现&#xff0c;马…

【已解决】c++ QT继承基类界面页面丢失问题

本博文源于自己在工位上遇到的一个问题&#xff0c;这个问题不只犯了一次了。首先我继承CBaseDialog里的一个标题栏&#xff0c;结果发现&#xff0c;界面本来想这样结果变成这样&#xff1a; 结果变成这个样子&#xff1a; 问题原因 在于ui.setupUi这个层面&#xff0c;错…

C语言王国——字符函数和字符串函数(2)

目录 5 strtok函数 5.1 函数的表达式 5.2 函数模拟 6 strstr函数 6.1 函数表达式 7 strerror函数 7.1 函数表达式 7.2 例子 7.3 perror 8 strncpy、strncat、strncmp函数 四 结论 5 strtok函数 strtok函数我的理解是他是一个分割字符串的函数 5.1 函数的表达式 cha…

光伏无人机踏勘需要使用哪些设备?用到哪些原理?

随着全球能源结构的转型和绿色能源的大力推广&#xff0c;光伏电站的建设和运维正成为能源领域的热点。然而&#xff0c;光伏电站的选址、建设和后期运维过程中&#xff0c;往往面临着地形复杂、设备分散、巡检难度大等挑战。在这一背景下&#xff0c;无人机踏勘技术以其独特的…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里&#xff0c;我们已经介绍了 Navicat 版本 17&#xff0c;现在我们来把注意力转移到另外两个值得关注的产品上&#xff0c;即 Navicat Data Modeler 和 Navicat BI&#xff08;之前称为 Navicat Chart Creator&#xff09;。今天的博客将介绍 Navicat Data Model…

draw.io 如何设置图形圆角?

draw.io 如何设置图形圆角呢&#xff1f; draw.io 是一款强大的&#xff0c;免费的开源工具&#xff0c;我经常用它来画流程图&#xff0c;但是我发现 draw.io 对于图形圆角的设置&#xff0c;只提供了一个设置选项&#xff0c;如下图&#xff1a; 当你选中某个图形&#xff0…

go语言进阶 init() 函数

go 语言包 在一个项目中通常我们需要引入第三方包&#xff0c;我们来看下 当我们导入一个包的时候 发生了什么&#xff1a; 首先我们先详细介绍下两个函数&#xff1a; init(), main() 是 go 语言中的保留函数。我们可以在源码中 定义 init()函数&#xff0c; 此函数会在包导入…

谷粒商城实战(031 业务-秒杀功能2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第315p-第p318的内容 秒杀上架 定时上架功能 EnableAsync 异步 EnableScheduling 定时调度 Configuration 配置类 创建上架定时任务类和方法 …

抖店商家疑惑,自然流量突然下滑,为什么呢?

大家好&#xff0c;我是喷火龙。 很多的抖店商家会遇到一种情况&#xff0c;那就是自己店铺的流量好好的&#xff0c;不知道怎么的就突然没流量了&#xff0c;各方面的数据都断崖式的下降。 为什么会这样呢&#xff1f;原因有以下几点&#xff0c;大家可以检查一下&#xff0…

Typora配置自动上传图片到图床

Typora配置自动上传图片到图床 在多平台发布文章时&#xff0c;如果遇到图片不能导入的问题&#xff0c;推荐使用图床&#xff01;推荐使用阿里云或腾讯云&#xff0c;免费的不用考虑了&#xff01; PicGo下载 链接&#xff1a;夸克网盘分享 使用手册&#xff1a; PicGo is…

《python开发》cannot allocate memory in static TLS block-报错问题解决

阿丹&#xff1a; 今天在配置跑rasa训练的时候出现问题&#xff0c;找了国内论坛有解决的人&#xff0c;但是说的不明白。查阅了很多论坛之后发现了解决的方案。 https://github.com/keras-team/keras-tuner/issues/317 问题描述以及错误&#xff1a; 关键错误 &#xff1a;c…

升级最新版openssh-9.7p1及openssl-1.1.1h详细步骤及常见问题总结

近期因为openssh相继被漏洞扫描工具扫出存在漏洞&#xff0c;所以考虑升级操作系统中的openssh和openssl为最新版本&#xff0c;来避免漏洞风险。期间的升级过程及遇到的疑难问题&#xff0c;特此记录下来&#xff0c;供有需要的人参考。 本次目标是升级 openssh 为 9.7p1 版本…