寻找痕迹的时候,另一个常用的好工具就是任务管理器。任务管理器是 Windows 自带的一个工具,可以帮助我们了解到非常多的信息
通过任务管理器寻找痕迹时,可以按照如上图所示的决议树了解一下环境。如果不能在任务管理器里面看到进程,那很大概就是进程已经崩掉了。如果能够看到进程,那大概就是进程卡了。此时关注点可以是 CPU 利用率。如果 CPU 利用率不动,那可以猜猜大概是死锁问题,如果 CPU 利用率爆高,那大概是死循环等问题。同步也看一下内存利用率,虽然在任务管理器里面看内存利用率不能真实反映内存利用环境,但是可以作为一个参考。详细关于如何正确查看步伐的内存利用环境,背面会有专门的内容介绍
无论是何种环境,都可以试试捞一个 DUMP 返来调试看看。当然了,对于软件崩掉的环境,先尝试一下是不是能启动起来,拼手的速度快速捞一个 DUMP 返来,如果不能,那后文还会和各人介绍其他工具来辅助捞 DUMP 文件
先回顾一下,咱的调查思绪一开始就是尝试寻找痕迹。寻找痕迹的时候借助 Windows 里面提供的好用的工具,这里重点介绍的是变乱查看器和任务管理器。通过变乱查看器可以快速的了解到软件崩溃的原因,通过任务管理器可以了解到软件的运行环境
进入混合调试之后,必要等待 Visual Studio 自动分析。如果是第一次调试 DUMP 文件的,大概会在下载符号这一步卡住一会。各人可以出去喝个茶,等待一下,再返来看看。实在等不急了,那就点击取消符号加载再继续吧
好的,现在咱的进度就是在用户侧发现了问题,且不能通过变乱查看器等结束战斗。将用户的 DUMP 文件捞返来,通过 Visual Studio 举行分析。分析的方法就是将 DUMP 文件拖入 Visual Studio 里面,然后点击混合调试按钮。等待 Visual Studio 自动分析,即可看到分析结果
那聪明的 Visual Studio 会帮咱分析出什么内容呢?如何看 Visual Studio 的分析结果呢?常见的套路就是关注 Visual Studio 以下三个方面内容
调用堆栈
后文会介绍的 "三板斧" 内容
局部变量
先来和各人介绍一下调用堆栈。调用堆栈是个好东西,调用堆栈是一个非常重要的内容,可以帮助我们了解到步伐是如何运行的。通过调用堆栈可以看到步伐是如何运行的,是从哪个函数开始的,是如何调用的,是如何返回的。默认的 Visual Studio 调试布局里面,可以快速看到调用堆栈窗格
调用堆栈可以如何看?调用堆栈可以和着之前在用户端任务管理器所见内容举行一起分析。如在任务管理器看不见进程,即对应进程崩了的问题,可以通过调用堆栈尝试看到是谁带崩的,崩之前调用的是哪个函数。如果是在任务管理器能看到进程,但是 CPU 利用率不动,那大概是死锁问题,可以通过调用堆栈看到是哪个函数卡住了主线程或进入锁。如果是 CPU 利用率爆高,那大概是死循环问题,可以通过调用堆栈看到是哪个函数跑满了线程
举个真实的例子,以下就是我从用户端捞返来的一个 DUMP 文件。通过 Visual Studio 分析,崩溃之前的调用堆栈如下
> 00000000() Unknown
[Frames below may be incorrect and/or missing] Unknown
再来看看对应 CPU 爆高的一个案例,此时堆栈里面的信息可以告诉咱,现在正在跑的方法是哪些。有大概就是当前的调用堆栈的顶部的几个方法有逻辑跑满了线程了。同样,此时配合代码食用更佳
但有大概此时面对的环境是没有代码。如利用的是第三方库等,此时靠堆栈信息是不够的。先让各人思考这个问题,如果此时没有代码还可以如何进一步分析?我将在后文和各人介绍如何通过三板斧来进一步分析
回顾一下,这就是咱拖入 DUMP 文件之后,依靠 Visual Studio 里面的调用堆栈举行问题分析的常见三个案例。对应软件崩溃的问题,可以通过调用堆栈看到是谁带崩的。对应 CPU 不动的问题,可以通过调用堆栈看到是谁卡住了主线程。对应 CPU 爆高的问题,可以通过调用堆栈看到是谁跑满了线程
回顾一下,以上咱就聊了在用户端发现问题,先尝试利用 Windows 自带工具快速举行定位问题。以及捞到 DUMP 文件之后,如何在开发机器上通过 Visual Studio 举行进一步分析。分析的方法就是将 DUMP 文件拖入 Visual Studio 里面,然后点击混合调试按钮。等待 Visual Studio 自动分析,即可看到分析结果。分析的重点是调用堆栈、三板斧、局部变量。通过这三个方面的工具可以帮助我们进一步的分析问题
如果 Visual Studio 还不能解决问题,那就找个工具人来帮忙利用 WinDbg 继续调盘问题
这就是第一个大方向的内容
为什么说有时候不好利用任务管理器捞 DUMP 呢?因为现实每每很复杂。除了闪崩,软件启动即崩溃导致的手速不够快,捞不到 DUMP 文件之外,另有其他很多问题。好比软件就是处于似崩未崩的状态,期望抓到某个时机的状态,如软件一定会在某次 CPU 爆高之后不能符合预期工作,然而 CPU 爆高的时间非常短,靠人类去看去抓是有些废步伐猿的。好比软件半夜崩溃,只有在午夜12点才会崩溃,这时候人类大概已经睡着了,纵然没睡着,大概错过了这个时间点就要等来日诰日的午夜12点了。再好比是非必现的问题,必要压测才能复现,期望自动化网络,否则大概要跑几千次才能复现一次,靠人类的工作量有些大
举个真实栗子来和各人演示多个工具之间的配合利用来调用一个有趣且复杂的问题
这个问题的开始是测试同砚和我报告了触摸失效问题,后来经过进一步调查发现其实是 explorer 未响应问题,表现就是 explorer 迷之闪黑
这个问题复杂之处在于 explorer 不是咱的,咱也不熟悉,也不知道是什么导致的。而且 explorer 太庞大了,捞到 DUMP 分析压力过大,耗时耗力。必要利用更多的工具辅助进一步分析问题
此时通过 Process Monitor 工具抓取 explorer 进程信息,发现了如上图的有趣的内容。里面很受我关注的就是存在了进程退出
通过网上四处搜发现 explorer 是一个多进程软件,进程的退出和迷之闪黑大概有所影响。既然进程退出了,那就试试上 ProcDump 工具在进程之前之后抓一个 DUMP 文件返来分析
由于 explorer 十分庞大,且咱也不熟悉 explorer 的代码,来回抓了几次 DUMP 分析都没有什么收获。直到某次抓取到了一个有趣的 DUMP 文件,通过这个 DUMP 文件发现了在进程退出之前的调用堆栈里面包含了 Shell32 的一些调用
再根据前面的 Process Monitor 工具抓到的在进程退出之前碰的是 Realtek Bluetooth 蓝牙模块,于是重心就在 Shell32 和蓝牙一起组合上面