一段时间内的内存转储

问题描述

当程序行为异常时,很容易捕获进程的内存转储,然后使用WinDBG之类的工具对其进行分析。但是,这是非常有限的,您只能获得该过程正在执行的快照,并且在某些情况下,找到为什么到达代码的特定部分真的很困难。

是否有任何方式可以捕获一段时间的内存转储,例如录制电影而不是拍照,这将指示这段时间内发生了什么变化以及这段时间内执行的部分代码间隔?

解决方法

记录许多内存转储

有什么办法可以在一段时间内捕获内存转储,例如录制电影而不是拍照

是的,存在。它称为Procdump,您可以使用-n参数定义转储数,并使用-s定义转储之间的秒数。对于较小的 s 值,它可能无法很好地工作,因为崩溃转储花费的时间更长。

示例:

procdump -ma -n 10 -s 1 <PID> ./dumps

但是,该技术通常不是很有用,因为您现在要分析10个转储,而不仅仅是1个-分析1个转储已经很困难。 AFAIK,没有工具可以比较两个转储并为您提供差异。

实时调试

恕我直言,您需要的是实时调试。 WinDbg也有可能。开发调试(使用IDE)和生产调试是两种不同的技能。因此,您无需在客户的生产环境中安装完整的IDE(例如Visual Studio)。实际上,如果将现有WinDbg安装复制到USB记忆棒上,它将可移植运行。

仅启动WinDbg,附加到进程( F6 ),启动日志文件(.logopen),set up Microsoft symbols,配置例外(sx)和让程序运行(g)。

远程调试

也许您甚至可能想看看WinDbg's remote debugging capabilities,但是由于IT限制(防火墙等),设置起来有些困难。

Visual Studio also offers remote debugging,因此您可以在计算机上使用VS,而只需在客户的计算机上安装较小的程序。我几乎没有经验,所以我不能告诉你很多。

记录

在该时间间隔内执行的代码部分?

我发现任何公司都采用的最典型的方法是打开应用程序的日志记录功能。

您还可以使用WPT(Windows Performance Toolkit)记录有用的数据,即WPR(Windows Performance Recorder),然后再使用WPA(Windows Performance Analyzer)对其进行分析。随着时间的推移,它将为您提供调用堆栈。