Outlook 如何准确查看每个外接程序使用的内存量?

Outlook 如何准确查看每个外接程序使用的内存量?,outlook,windbg,Outlook,Windbg,有没有办法让我知道每个Outlook加载项使用了多少内存?我在32位Office上有几个客户都有屏幕闪烁和崩溃的问题,我怀疑我们作为一家公司部署了太多的加载项,即使使用大地址感知(LAA),他们的内存也在耗尽,这导致Outlook崩溃 我在Outlook中没有看到这样做的方法,所以我创建了.dMP文件,我通过WINBG打开它,但是我对这个应用程序是新的,没有线索如何通过特定的插件(具体的.dMP文件只是Outlook .exe)< /p> < p>来查看假设在C++或其他“原生”语言中创建的插件

有没有办法让我知道每个Outlook加载项使用了多少内存?我在32位Office上有几个客户都有屏幕闪烁和崩溃的问题,我怀疑我们作为一家公司部署了太多的加载项,即使使用大地址感知(LAA),他们的内存也在耗尽,这导致Outlook崩溃


<>我在Outlook中没有看到这样做的方法,所以我创建了.dMP文件,我通过WINBG打开它,但是我对这个应用程序是新的,没有线索如何通过特定的插件(具体的.dMP文件只是Outlook .exe)< /p> < p>来查看假设在C++或其他“原生”语言中创建的插件,至少不.NET./P> 使用
new
语句的内存分配转到。为了找出谁分配了内存,这些信息也需要存储在堆中

但是,您不能在
new
语句中提供该信息,即使可能,您也需要重写代码中的所有
new
语句

另一种方法是,
HeapAlloc()
在需要内存时查看调用堆栈。在正常操作中,这会带来太多的成本(时间方面)和太多的开销(内存方面)。但是,可以启用所谓的用户模式堆栈跟踪数据库,有时缩写为UST数据库。您可以使用WinDbg附带的工具
GFlags

捕获内存快照的工具是
UMDH
,WinDbg也提供了该工具。它将结果存储为纯文本文件。应该可以从这些UST中提取统计数据,但是,我不知道有什么工具可以做到这一点,这意味着您需要自己编写一个

第三种方法是使用“堆标记”的概念。但是,它相当复杂,还需要在代码中进行修改。我从未实施过,但你可以看看这个问题

假设UST方法看起来最可行。UST数据库应该有多大

到目前为止,50MB足够我识别和修复内存泄漏。然而,对于那个用例,获取关于所有内存的信息并不重要。它只需要足够的样本来支持一个假设。这50 MB是在应用程序内存中分配的,因此可能会影响应用程序

UST数据库仅存储地址,而不存储调用堆栈文本。因此,在32位应用程序中,调用堆栈上的每个帧只需要32位存储

在您的情况下,50 MB是不够的。考虑到平均深度为10帧,平均分配大小为256字节(整数为4字节,但字符串等更大的值),可以得到

4 GB/256字节=16M分配

16M分配*10帧*4字节/帧=640MB

如果给定的假设是现实的(我不能保证),则需要640MB的UST数据库大小。这将对您的应用程序产生很大影响,因为它将内存从4 GB减少到3.3 GB,因此OOM来得更早

如果在创建崩溃转储时配置了UST信息,则DMP文件中也应包含UST信息。当然不是在你的DMP文件中,否则你会告诉我们的。然而,它并不是以一种有利于统计的方式提供的。使用UMDH文本文件IMHO是一种更好的方法

有没有办法让我知道每个Outlook加载项使用了多少内存

不是你现在拥有的DMP文件。使用WinDbg提供的工具仍然很困难

还有一些其他选择:

  • 禁用所有插件并测量Outlook本身的内存。然后,一次启用一个插件,并使用该插件启用的内存进行测量。计算差异,找出插件需要的额外内存

  • 它在启动时会立即崩溃吗?或者以后,比如说使用10分钟后?可能是内存泄漏吗?识别内存泄漏可能更容易:只需一次启用一个插件,并随时间监控内存使用情况。使用内存探查器,而不是WinDbg。它将更易于使用,并且可以绘制您需要的适当图形


请注意,您需要定义一个清晰的进程来测量内存。只有在执行特定操作(“延迟初始化”)时,才会分配一些内存。也许你也想要测量这个内存。

下面假设插件是用C++或其他“原生”语言创建的,至少不是.net。 使用
new
语句的内存分配转到。为了找出谁分配了内存,这些信息也需要存储在堆中

但是,您不能在
new
语句中提供该信息,即使可能,您也需要重写代码中的所有
new
语句

另一种方法是,
HeapAlloc()
在需要内存时查看调用堆栈。在正常操作中,这会带来太多的成本(时间方面)和太多的开销(内存方面)。但是,可以启用所谓的用户模式堆栈跟踪数据库,有时缩写为UST数据库。您可以使用WinDbg附带的工具
GFlags

捕获内存快照的工具是
UMDH
,WinDbg也提供了该工具。它将结果存储为纯文本文件。应该可以从这些UST中提取统计数据,但是,我不知道有什么工具可以做到这一点,这意味着您需要自己编写一个

第三种方法是使用“堆标记”的概念。但是,它相当复杂,还需要在代码中进行修改。我从未实施过,但你可以看看这个问题

假设UST方法看起来最可行。应该有多大