windows - 调查内存泄漏

标签 windows debugging memory-management memory-leaks windbg

我们的应用程序中有一个缓慢的内存泄漏,我已经通过以下步骤尝试分析泄漏的原因:

  1. 在 GFlags 中启用用户模式堆栈跟踪数据库
  2. 在 Windbg 中,键入以下命令:!heap -stat -h 1250000(其中 1250000 是发生泄漏的堆的地址) 比较多个转储后,我看到大小为 0xC 的内存块随时间增加,可能是泄漏的内存。
  3. 键入以下命令:!heap -flt s c 给出这些分配的 UserPtr,最后:
  4. 在其中一些地址上键入 !heap -p -a address 总是会显示以下分配调用堆栈:

0:000> !heap -p -a 10576ef8

address 10576ef8 found in
_HEAP @ 1250000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    10576ed0 000a 0000  [03]   10576ef8    0000c - (busy)
    mscoreei!CLRRuntimeInfoImpl::`vftable'
    7c94b244 ntdll!RtlAllocateHeapSlowly+0x00000044
    7c919c0c ntdll!RtlAllocateHeap+0x00000e64
    603b14a4 mscoreei!UtilExecutionEngine::ClrHeapAlloc+0x00000014
    603b14cb mscoreei!ClrHeapAlloc+0x00000023
    603b14f7 mscoreei!ClrAllocInProcessHeapBootstrap+0x0000002e
    603b1614 mscoreei!operator new[]+0x0000002b
    603d402b +0x0000005f
    603d5142 mscoreei!GetThunkUseState+0x00000025
    603d6fe8 mscoreei!_CorDllMain+0x00000056
    79015012 mscoree!ShellShim__CorDllMain+0x000000ad
    7c90118a ntdll!LdrpCallInitRoutine+0x00000014
    7c919a6d ntdll!LdrpInitializeThread+0x000000c0
    7c9198e6 ntdll!_LdrpInitialize+0x00000219
    7c90e457 ntdll!KiUserApcDispatcher+0x00000007

这看起来像线程初始化调用堆栈,但我需要了解的不止于此。 您建议下一步做什么,以便找出泄漏的确切原因。

最佳答案

使用 GFlags 时记录的堆栈是在没有使用 .pdb 的情况下完成的,而且通常不正确。 由于您已将泄漏追踪到给定堆上的特定大小,您可以尝试 在 RtlAllocateHeap 中设置实时中断并使用适当的符号检查 windbg 中的堆栈。我已经成功地使用了以下内容。您必须对其进行编辑以适合您的堆和大小。

 $$ Display stack if heap handle eq 0x00310000 and size is  0x1303
 $$ ====================================================================
bp ntdll!RtlAllocateHeap "j ((poi(@esp+4) = 0x00310000) & (poi(@esp+c) = 0x1303) )'k';'gc'" 

也许您随后会为违规者获得另一个堆栈和其他想法。

关于windows - 调查内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10030349/

相关文章:

c++ - 为什么显示 ListView 图标时背景变黑?

windows - 如何在Windows上使用Boot2Docker构建镜像?

windows - Windows 应用程序的最佳安装文件夹结构

android - 启用 Android 支持库调试标志的最佳方式

memory-management - 为什么以下 Fortran 代码根据派生类型的内容在堆栈/堆上进行分配?

windows - 查询 http header 时出现错误 ERROR_WINHTTP_HEADER_NOT_FOUND

debugging - WinDbg环境变量

c++ - gprof 和可执行文件的参数

c#-4.0 - CRM 2011 插件 - 对属性名称使用早期绑定(bind)实体是否会导致内存问题?

.net - 在处理阻塞过程时管理线程和内存使用情况