实用小技巧:vs2022多线程调试

本文介绍了如何在使用.NET9的AOT编译器ILC时调试多线程程序,尤其是在使用`Parallel.ForEach`时遇到的断点飘忽问题。通过冻结除当前线程外的所有线程,实现单步调试。
摘要由CSDN通过智能技术生成

点击上方蓝字 江湖评谈设为关注

159d4a43144401ac716c9bc9e38385f8.png

前言

多线程怎么调试呢?通过AOT编译器ILC来看下,如何调试多线程?

.NET9 ILC编译托管方法用的是CPU密集型Parallel.ForEach并行,因为多个方法并行运行导致了断点的飘忽。这里可以通过VS提供的线程冻结方式,冻结其它所有线程,只运行当前线程的方式来进行单步调试。

ILC代码

ILC并行编译函数代码如下:

private void CompileMultiThreaded(List<MethodCodeNode> methodsToCompile)
  {
      if (Logger.IsVerbose)
      {
          Logger.LogMessage($"Compiling {methodsToCompile.Count} methods...");
      }


      Parallel.ForEach(
          methodsToCompile,
          new ParallelOptions { MaxDegreeOfParallelism = _parallelism },
          CompileSingleMethod);
  }

methodsToCompile是需要编译的所有方法,这里面用了Parallel.ForEach进行函数并行编译。像这种情况,如果调试CompileSingleMethod回调方法,则会导致了断点飘忽不定。

解决方法

在调试的过程中(没有退出调试),VS菜单栏-》调试-》窗口-》线程,打开线程窗口。

c35818bf662eced916569de357ec54a5.png

看到黄色箭头指向的就是当前运行的线程,但同时还有其它的很多线程一起运行。Ctrl+A全选所有线程,注意去掉选择黄色箭头指向的线程,因为它是我们要调试的线程。右键-》冻结线程。如下图:

250050993c67ffb39a5f6c4ebaddba52.png

其它线程冻结了,这个时候,我们就可以愉快的调试当前线程了。

往期精彩回顾

CLR/JIT学习圈

面试官问.Net对象赋值为null,就会被GC回收吗?

fb02592d42257390f1031e25d5fa352f.jpeg

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值