有没有办法为所有堆userptr获取用户堆栈

djs*_*djs 2 c++ memory-leaks windbg

我正在阅读这篇文章,使用windbg检测内存泄漏。我试图找到一种方法,当为特定大小的内存块筛选堆时,为出现的所有userptr打印userstack。这可能吗 ?我希望实现以下目标:

  foreach(userPtr) 
    dump_to_a_file !heap -p -a userPtr
Run Code Online (Sandbox Code Playgroud)

其中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)
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ler 5

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

.shell -ci "!heap -flt s xxx" find "["
Run Code Online (Sandbox Code Playgroud)

现在它的输出非常稳定,可以在foreach循环中使用:

.foreach (userptr {.shell -ci "!heap -flt s xxx" find "["}) { .echo ${userptr}}
Run Code Online (Sandbox Code Playgroud)

看看如何分割每一行。让我们使用摆脱前4个标记(条目,大小,上一个,标志)和后3个标记(用户大小,-,状态)/pS 4 /ps 7

.foreach /pS 4 /ps 7 (userptr {.shell -ci "!heap -flt s xxx" find "["}) { .echo ${userptr}}
Run Code Online (Sandbox Code Playgroud)

现在您有了纯地址,可以使用它来做一些有用的事情,即 !heap -p -a

.foreach /pS 4 /ps 7 (userptr {.shell -ci "!heap -flt s xxx" find "["}) { !heap -p -a ${userptr}}
Run Code Online (Sandbox Code Playgroud)

要将其转储到文件中,请用日志(.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
Run Code Online (Sandbox Code Playgroud)

妳去