我正在阅读这篇文章detecting memory leak using windbg。我正在尝试找到一种方法,可以为堆过滤特定大小的内存块时出现的所有userptr打印userstack。这可能吗 ?
我正在寻求实现以下目标:

  foreach(userPtr)
    dump_to_a_file !heap -p -a userPtr

其中userPtr是:UserPtr如下
HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        003360e0 03f0 0000  [07]   003360e8    01f64 - (busy)
        00338060 03f0 03f0  [07]   00338068    01f64 - (busy)
        00339fe0 03f0 03f0  [07]   00339fe8    01f64 - (busy)

我正在尝试这样做,以避免手动检查成千上万的此类UserPtr。感谢您提供的任何帮助。

最佳答案

这是!heap -flt s xxx命令的输出,该命令在堆条目表之前和之后包含很多文本。让我们通过修改来摆脱其他文本

.shell -ci "!heap -flt s xxx" find "["

现在它的输出非常稳定,可以在foreach循环中使用:
.foreach (userptr {.shell -ci "!heap -flt s xxx" find "["}) { .echo ${userptr}}

看看它是如何分割每一行的。让我们使用/pS 4 /ps 7摆脱前4个标记(条目,大小,上一个,标志)和后3个标记(用户大小,-,状态)。
.foreach /pS 4 /ps 7 (userptr {.shell -ci "!heap -flt s xxx" find "["}) { .echo ${userptr}}

现在您有了纯地址,对它进行一些有用的操作,即!heap -p -a
.foreach /pS 4 /ps 7 (userptr {.shell -ci "!heap -flt s xxx" find "["}) { !heap -p -a ${userptr}}

要将其转储到文件中,请用日志(.logopen.logclose)将其包围:
.logopen d:\debug\logs\heap.log; .foreach /pS 4 /ps 7 (userptr {.shell -ci "!heap -flt s xxx" find "["}) { !heap -p -a ${userptr}}; .logclose

妳去

关于c++ - 有没有一种方法可以获取所有堆userptr的userstack,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24451461/

10-09 13:28