一段时间内存转储

Memory dump for period of time

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

有没有办法捕获一段时间内的内存转储,比如录制电影而不是拍照,这将表明那段时间发生了什么变化,以及在这段时间内执行的代码部分那个时间间隔?

记录许多内存转储

Is there any way of capturing memory dumps for a period of time, like recording a movie rather than taking a picture

是的,存在。它称为 Procdump,您可以使用 -n 参数定义转储数,使用 -s 定义转储之间的秒数。它可能不适用于 s 的小值,因为获取故障转储需要更长的时间。

示例:

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

但是,这种技术通常不是很有用,因为您现在有 10 个转储要分析,而不是只有 1 个 - 分析 1 个转储已经很困难了。据我所知,没有任何工具可以比较两个转储并为您提供差异。

实时调试

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

只需启动 WinDbg,附加到进程 (F6),启动日志文件 (.logopen),,配置异常 (sx) 并让程序 运行 (g).

远程调试

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

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

日志记录

the parts of the code that were executed in that time interval?

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

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