前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C#使用线程窗口调试多线程程序

C#使用线程窗口调试多线程程序

作者头像
用户9127601
发布于 2021-11-01 09:02:05
发布于 2021-11-01 09:02:05
92200
代码可运行
举报
文章被收录于专栏:dotNET编程大全dotNET编程大全
运行总次数:0
代码可运行

调试多线程程序一般有以下几种办法

1、在日志的某个地方写日志文件

优点:不会干扰程序的执行,特别是对网络的多线程通信。

缺点:每次都需要打开日志文件以查看进程运行的信息。

2、利用断点进行调试。

优点:直观,可以直接看到运行过程的值

缺点:在多个线程设置断点,可能让程序跳来跳去,还需要额外地分出一部分精力用来理清程序的逻辑

3、利用弹出窗口来查看进程调试的信息。

优点;直观

缺点;在调试网路通信的时候,使得通信的过程产生延时,导致通信失败。

4、利用vs自带的线程窗口来调试

优点:直观,可以直接从进程图上看到哪个进程是活动进程,哪些进程处于阻塞状态。

缺点:需要结合断点调试,基本上就是断点调试的加强版

前面三种都比较基础大多数人应该已经掌握了 ,下面针对第四种再详细说明下:

比如以下示例:开了两个线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Task.Run(() =>
            {
                var count = 0;
                while(true)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"{count}");
                    count++;
                }

            });
            Task.Run(() =>
            {
                var count = 0.12345;
                while (true)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"{count}");
                    count += 0.1; ;
                }
            });

我仅在第一个线程设置了断点,只想在第一线程跟踪变量变化,但是实际上单步调试的时候你会发现,程序会跳来跳去,一会儿再上面哪个线程,一会儿又在下面哪个线程执行,

这时候的一般的做法是:

这是我做的:

  1. 设置一个条件断点,我知道这个断点只会出现在我正在寻找的线程上。
  2. 一旦断点命中并且你在你想要的线程中,在Visual Studio线程窗口中(在调试,调试 - > Windows - >线程时),Ctrl+ A(选择所有线程),然后Ctrl+单击您当前所在的线程。除了要调试的线程之外,您应该拥有所有线程。
  3. 单击鼠标右键,然后选择“冻结”。

但是实际上:

冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。

最正确和最有用的方法是:

  1. 在断点窗口中按Ctrl + A(选择所有断点)。
  2. 右键单击并选择“过滤器...”。
  3. 输入“ThreadId =(当前线程ID)”。

Visual Studio 2015及更高版本中,过程类似于:

  1. 在断点窗口中按Ctrl + A(选择所有断点)。
  2. 右键单击并选择“设置...”。
  3. 选中“条件”,然后在下拉列表中选择“过滤器”
  4. 输入“ThreadId =(当前线程ID)”。

所以所有线程都被执行,但调试器仅在当前线程上命中。

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

本文分享自 dotNET编程大全 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验