• VS2022如何进行多线程调试
  • 发布于 1周前
  • 47 热度
    0 评论
前言
多线程怎么调试呢?通过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...");
      }
      // 堆代码 duidaima.com
      Parallel.ForEach(
          methodsToCompile,
          new ParallelOptions { MaxDegreeOfParallelism = _parallelism },
          CompileSingleMethod);
  }
methodsToCompile是需要编译的所有方法,这里面用了Parallel.ForEach进行函数并行编译。像这种情况,如果调试CompileSingleMethod回调方法,则会导致了断点飘忽不定。

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

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