vs2022的一些调试技巧——远程调试&线程检查&性能检查
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来追踪代码的执行性能。
vs2022的一些调试技巧——远程调试&线程检查&性能检查的更多相关文章
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
- (GDB) GDB调试技巧,调试命令
调试时查看依赖DSO pidof tvm_rpc_server cat /proc/<pid_of_tvm_rpc_server>/maps 子进程调试 1.vscode -- launc ...
- js调试技巧 Firefox调试技巧汇总
Firebug入门指南 : http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html Firebug控制台详解: htt ...
- Visual Studio原生开发的10个调试技巧
这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...
- Visual Studio原生开发的10个调试技巧(一)
最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其 ...
- Visual Studio原生开发的10个调试技巧(转)
本文由 伯乐在线 - JingerJoe 翻译自 Marius Bancila.转载请参见文章末尾处的要求. [感谢@_La_Isla_Bonita 的热心翻译.如果其他朋友也有不错的原创或译文, ...
- Java项目调试技巧及版本控制
开发项目中,调试是必不可少的. 本篇博客从以下4个方面介绍项目调试技巧: 响应状态码的含义 服务端断点调试技巧 客户端断点调试技巧 设置日志级别,并将日志输出到不同的终端 以及,最后简单的介绍了一下g ...
- Visual Studio原生开发的20条调试技巧(下)
我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...
- MyEclipse远程调试Tomcat
程序就是这么一个神奇的东西,有时你的一个项目,在本机上运行得还是好好的,可当你把这货放到了服务器上,同样的条件就是结果不一样.于是就灰常想看一下程序在远程运行时候的状态,希望让程序在远程运行,还可以在 ...
随机推荐
- IO 流分类
更多内容,前往 IT-BLOG 一.File File 类(磁盘操作)可以用于表示文件和目录的信息,但是它不表示文件的内容.递归地列出一个目录下所有文件: 1 public static void l ...
- 【接口测试】Postman(二)-Postman Echo
Postman Echo Postman Echo为用户提供API调用的示例服务.简而言之,就是官方提供的一个API帮助文档.初学者可以通过它很快的掌握Postman工具.我们下面将一一介绍他们. ...
- Xenomai 再探
一.Xenomai API 接口使用总结 Alarm-操作: 在使用实时任务过程中,采用看门狗定时器进行延时操作时,会产生实时域到非实时域的上下文切换操作,从而导致实时线程实时性受到影响,具体如下: ...
- 基于swiper.js的异型轮播
基于原生swiper.js的异型轮播 <div class="swiper-container" > <div class="swiper-wrappe ...
- SaaS、PaaS、IaaS区别
SaaS SaaS 越久,觉得它个庞大的领域 SaaS 收入的"长江流域". 传统软件像买房:什么都得自己买,价格昂贵,一般人用不起.SaaS模式就像是租赁预先装修好的共享公寓,拎 ...
- Unity3D中的Attribute详解(四)
本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...
- mysql数据类型精讲
1.MySQL中的数据类型 常见数据类型的属性,如下: 2.整数类型2.1 类型介绍整数类型一共有 5 种,包括 TINYINT.SMALLINT.MEDIUMINT.INT(INTEGER)和 BI ...
- Python程序笔记20230303
成绩评级程序 分数 < 60,D 60 <= 分数 < 80,C 80 <= 分数 < 90,B 90 <= 分数 < 100,A 分数 == 100,S # ...
- Git提交代码仓库的两种方式
目录 一: 两种本地与远程仓库同步 1 git 远程仓库 提交本地版本库操作 提交到远程版本库操作 1.Git 全局设置: 2.增加一个远程仓库地址 3.查询当前存在的远程仓库 5.本地版本库内容提交 ...
- mysql数据库常见优化方法
1,创建适当的索引(主键索引.唯一索引.普通索引.全文索引.空间索引). 2,对sql语句进行优化--->慢查询(explain). 3,使用分表技术(水平分表,垂直分表),分区技术. 4,读写 ...