`sizeof` C ++应用程序中的所有类型

灰猫

在Windows C ++应用程序中调试可疑的内存泄漏,我设法获得了如下所示的堆分配统计信息(这是!heap -stat -h ...针对WinDbg中相关堆执行命令的结果):

size     #blocks     total     ( %) (percent of total busy bytes)
651 686f0 - 293a51f0  (54.65)
260 68701 - f80a260  (20.55)
11c 68705 - 73dc98c  (9.60)
...

从我对应用程序的了解来看,这确实看起来很像是一个泄漏,但是鉴于我只使用没有用户堆栈跟踪信息的转储,因此我只能进行猜测和其他方法。

我可以考虑的一件事是了解这些0x651或0x260字节分配所指的是哪个类或结构,因为这些分配看起来似乎很可疑。我想到的一种简单方法是列出应用程序中列出的每个类/结构,并sizeof为其获取结果。

有没有简单的方法可以做到这一点(即不求助于使用某种C ++解析器(或更糟的是,正则表达式)手动提取结构/类,并sizeof在编译器或类似程序中运行)?

托马斯·韦勒

我不知道列出所有类型和所有尺寸的方法。

但是,您可以将x(检查符号)与/s选项一起使用,以找到与您感兴趣的大小匹配的类型。

例:

0:004> x /d /s 0n28 ole32!*
[...]
00000000`76a06e78 ole32!IViewObject2_StubThunkTable = <function> *[7]
00000000`769d97fc ole32!g_wszInprocHandler16 = wchar_t [14] "InprocHandler"
00000000`76a96194 ole32!g_wszIconReference = wchar_t [14] "IconReference"

因此,在您的情况下,命令将是

x /s 651 <mydll>!*

甚至

x /s 651 *!*

如果您不怀疑特定的DLL。

可以使用类似的方法dt -e -s 0n28 ole32!*,但是并不需要将其*!*作为参数。

不幸的是,仍然没有这种类型,因为

  • 内存由分配 malloc()
  • 它只是一堆相同的字符串或动态分配的其他对象
  • ...

在这种情况下,您可能想要尝试!heap -flt s 651看看UserPtr其中一些。

例:

0:004> !heap -flt s 2268
    _HEAP @ 130000
              HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
        0000000000131330 0229 0000  [00]   0000000000131360    02268 - (busy)
    _HEAP @ 20000

0:004> db 0000000000131360    L30
00000000`00131360  3d 00 3a 00 3a 00 3d 00-3a 00 3a 00 5c 00 00 00  =.:.:.=.:.:.\...
00000000`00131370  41 00 4c 00 4c 00 55 00-53 00 45 00 52 00 53 00  A.L.L.U.S.E.R.S.
00000000`00131380  50 00 52 00 4f 00 46 00-49 00 4c 00 45 00 3d 00  P.R.O.F.I.L.E.=.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章