前言
多线程怎么调试呢?通过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全选所有线程,注意去掉选择黄色箭头指向的线程,因为它是我们要调试的线程。右键-》冻结线程。如下图:
其它线程冻结了,这个时候,我们就可以愉快的调试当前线程了。