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。感谢您提供的任何帮助。
这是!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)
妳去
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |