调试多线程程序一般有以下几种办法
1、在日志的某个地方写日志文件。
优点:不会干扰程序的执行,特别是对网络的多线程通信。
缺点:每次都需要打开日志文件以查看进程运行的信息。
2、利用断点进行调试。
优点:直观,可以直接看到运行过程的值
缺点:在多个线程设置断点,可能让程序跳来跳去,还需要额外地分出一部分精力用来理清程序的逻辑
3、利用弹出窗口来查看进程调试的信息。
优点;直观
缺点;在调试网路通信的时候,使得通信的过程产生延时,导致通信失败。
4、利用vs自带的线程窗口来调试
优点:直观,可以直接从进程图上看到哪个进程是活动进程,哪些进程处于阻塞状态。
缺点:需要结合断点调试,基本上就是断点调试的加强版
前面三种都比较基础大多数人应该已经掌握了 ,下面针对第四种再详细说明下:
比如以下示例:开了两个线程
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; ;
}
});
我仅在第一个线程设置了断点,只想在第一线程跟踪变量变化,但是实际上单步调试的时候你会发现,程序会跳来跳去,一会儿再上面哪个线程,一会儿又在下面哪个线程执行,
这时候的一般的做法是:
这是我做的:
但是实际上:
冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。
最正确和最有用的方法是:
在Visual Studio 2015及更高版本中,过程类似于:
所以所有线程都被执行,但调试器仅在当前线程上命中。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有