新乡网站的建设,做网站干什么,定制网站开发方案,门户类网站注重什么我们用来分析CPU过高、死锁问题的常见方案是使用Windbg分析dump文件。但是这种方式存在一些缺点#xff0c;比如dump文件过大难以下载#xff0c;windbg使用过于复杂难以掌握等。这里介绍一个小工具dotnet-stack#xff0c;帮助我们检查托管代码调用堆栈#xff0c;快速定位… 我们用来分析CPU过高、死锁问题的常见方案是使用Windbg分析dump文件。但是这种方式存在一些缺点比如dump文件过大难以下载windbg使用过于复杂难以掌握等。这里介绍一个小工具dotnet-stack帮助我们检查托管代码调用堆栈快速定位到当前执行的代码找到问题原因。准备代码新建ConsoleApp1编写如下代码static void Main(string[] args)
{new Program().TestLock();Console.Read();
}void TestLock()
{lock (this){var task Task.Factory.StartNew(() {Console.WriteLine(-------开始-------);Deadlock();Console.WriteLine(---------完成--------);});task.Wait();}
}void Deadlock()
{lock (this){Console.WriteLine(公众号“My IO”);}
}
示例代码通过抢占lock模拟死锁现象运行代码后可以发现命令行停在-------开始-------就没有继续输出了。分析问题首先运行下面的命令安装dotnet-stackdotnet tool install --global dotnet-stack
然后我们需要找到死锁程序对应的进程id。虽然可以用任务管理器或者ps去查看但是这里可以直接用命令获取dotnet-stack ps
拿到ConsoleApp1的进程id6004运行下列命令dotnet-stack report --process-id 6004
该命令可从进程中收集跟踪的所有堆栈。格式如下:注释前缀为#每个线程都有一个包含本机线程ID的头Thread (thread-id):托管代码: 模块!方法非托管代码[Native Frames]从图中可以看到最后执行到的代码是ConsoleApp1!Program.Deadlock()对照代码就可以轻松找到死锁原因了。结论dotnet-stack麻雀虽小但是功能不错用于解决死锁问题还是不错的。如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我