`sizeof` C++ 应用程序中的所有类型
`sizeof` all types in C++ application
在 Windows C++ 应用程序中调试可疑的内存泄漏,我已经设法获得看起来像这样的堆分配统计信息(这是在 WinDbg 中为相关堆执行的 !heap -stat -h ...
命令的结果) :
size #blocks total ( %) (percent of total busy bytes)
651 686f0 - 293a51f0 (54.65)
260 68701 - f80a260 (20.55)
11c 68705 - 73dc98c (9.60)
...
根据我对应用程序的了解,这确实看起来很像泄漏,但考虑到我只处理没有 user stack trace 信息的转储,我只能靠猜测,并且其他方法。
我能想到的一件事是了解这些分配的 0x651 或 0x260 字节指的是哪个 class 或结构,因为这些分配看起来很可疑。我能想到的一种直接方法是列出我的应用程序中列出的每个 class/struct 并获得 sizeof
结果。
是否有任何简单的方法可以做到这一点(即无需借助某种 C++ 解析器(或更糟的是正则表达式)和 运行 sizeof
手动提取 structs/classes在编译器或类似的东西中)?
我不知道有什么方法可以列出所有类型和所有尺寸。
但是,您可以使用 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.=.
在 Windows C++ 应用程序中调试可疑的内存泄漏,我已经设法获得看起来像这样的堆分配统计信息(这是在 WinDbg 中为相关堆执行的 !heap -stat -h ...
命令的结果) :
size #blocks total ( %) (percent of total busy bytes)
651 686f0 - 293a51f0 (54.65)
260 68701 - f80a260 (20.55)
11c 68705 - 73dc98c (9.60)
...
根据我对应用程序的了解,这确实看起来很像泄漏,但考虑到我只处理没有 user stack trace 信息的转储,我只能靠猜测,并且其他方法。
我能想到的一件事是了解这些分配的 0x651 或 0x260 字节指的是哪个 class 或结构,因为这些分配看起来很可疑。我能想到的一种直接方法是列出我的应用程序中列出的每个 class/struct 并获得 sizeof
结果。
是否有任何简单的方法可以做到这一点(即无需借助某种 C++ 解析器(或更糟的是正则表达式)和 运行 sizeof
手动提取 structs/classes在编译器或类似的东西中)?
我不知道有什么方法可以列出所有类型和所有尺寸。
但是,您可以使用 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.=.