`sizeof` всех типов в приложении C ++ - PullRequest
0 голосов
/ 22 января 2019

Отладка предполагаемой утечки памяти в приложении 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 в компиляторе или чем-то подобном)?

1 Ответ

0 голосов
/ 22 января 2019

Я не знаю способа перечисления всех типов вместе со всеми размерами.

Однако вы можете использовать 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.=.
...