🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
一:背景
1.讲故事
在分析的众多dump中,经常会遇到各种奇葩的问题,仅通过dump这种快照形式还是有很多问题搞不定,而通过 perfview 这种粒度又太粗,很难找到问题之所在,真的很头疼,比如本篇的 短命线程
问题,参考图如下:
我们在 t2 时刻抓取的dump对查看 短命线程
毫无帮助,我根本就不知道这个线程生前执行了什么代码,为什么这么短命,还就因为这样的短命让 线程池 的线程暴增。
为了能尽最大努力解决此类问题,武器库中还得再充实一下,比如本系列要聊的 Time Travel Debug
,即时间旅行调试。
二: Time Travel Debug
1. 什么是 时间旅行调试
如果说 dump 是程序的一张照片,那 TTD 就是程序的一个短视频,很显然短视频的信息量远大于一张照片,因为视频记录着疑难杂症的前因后果,参考价值巨大,简直就是银弹般的存在。
三:案例演示
1. 参考代码
这是我曾经遇到的一个真实案例,在没有 TTD 的协助下最终也艰难的找到了问题,但如果有 TTD 的协助简直就可以秒杀,为了方便说明,先上一个测试代码。
internal class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 200; i++)
{
Task.Run(() =>
{
Test();
});
}
Console.ReadLine();
}
public static int index = 1;
static void Test()
{
Thread.Sleep(1000);
var i = 10;
var j = 20;
var sum = i + j;
Console.WriteLine($"i={index++},sum={sum}");
}
}
程序跑完之后,我们抓一个dump文件,输出如下。
0:000> !t
ThreadCount: 20
UnstartedThread: 0
BackgroundThread: 7
PendingThread: 0
DeadThread: 13
Hosted Runtime: no