我正在阅读这篇文章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/