Этот вопрос очень похож на:
расследование утечки памяти windbg - отсутствует куча памяти
За исключением того, что в моем случае все x86, тогда как ответ на этот пост говорит, что Windbg x64 не работает.
В моем случае, когда я делаю "! Heap -s", я получаю:
************************************************************************************************************************
NT HEAP STATS BELOW
************************************************************************************************************************
LFH Key : 0x653c3365
Termination on corruption : DISABLED
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-----------------------------------------------------------------------------
00e70000 00000002 761224 757296 761012 6306 1149 51 0 572b1 LFH
00d60000 00001002 1292 128 1080 26 7 2 0 0 LFH
01050000 00001002 1292 1048 1080 271 18 2 0 31 LFH
..snip..
Где меня интересует куча на 00e70000.
Далее при выполнении команды:! Heap -stat -h 00e70000 -grp s 0n999
Я получаю 509 строк вывода для каждого блока в этой куче, перечисляя его размер группы, количество блоков, которые соответствуют этому размеру, и общий объем памяти, используемый всеми блоками этого размера. Частичный вывод:
0:000> !heap -stat -h 00e70000 -grp s 0n999
heap @ 00e70000
group-by: TOTSIZE max-display: 999
size #blocks total ( %) (percent of total busy bytes)
1000 14a - 14a000 (20.24)
600c 16 - 84108 (8.10)
168 408 - 5ab40 (5.56)
154 404 - 55550 (5.23)
10d8 2a - 2c370 (2.71)
24 113f - 26cdc (2.38)
22750 1 - 22750 (2.11)
Затем я вставляю все это в excel, преобразую 3-й столбец в десятичную и суммирую, получая всего 6,5 мегабайт или около того.
Оба! Address -summary, а также! Heap -s указывают на то, что я должен получить сумму чего-то около 808 мегабайт. Это наводит меня на мысль, что либо я не понимаю единицы команды -stat, либо, возможно, оба x64 и x86 (весь Windbg) сломаны, либо у меня есть более фундаментальное недоразумение.
Может ли кто-нибудь помочь мне понять, в чем дело?
Спасибо!
Редактировать: Дополнительная информация
Используя DebugDiag, я вижу, что основная (по умолчанию) куча имеет 46/54 сегментов, которые имеют общую функцию, все они имеют размер 15,81 мегапикселя, и все они почти полностью выделены. Это общая разница, по которой я скучаю.
Увидев это, я вспоминаю, что наш родной код использует FASTMM4, который, вероятно, учитывает оба этих сегмента, а также почему я не отображаю эти объекты внутри них в Windbg.
Поэтому я планирую удалить FASTMM4 из собственного кода и снова запустить тест perf, чтобы посмотреть, не изменится ли это. Пожалуйста, не стесняйтесь добавлять что-нибудь полезное по этому поводу.
Второе редактирование, Дополнительная информация:
После удаления FASTMM из нашей кодовой базы и повторного запуска тестов я вижу, что сегменты объемом 15,81 МБ все еще существуют и все еще протекают. Их можно увидеть в анализе DebugDiag как:
Segment Information
Base Address Reserved Size Committed Size Uncommitted Size Number of uncommitted ranges Largest uncommitted block Calculated heap fragmentation
0x00e70000 1020 KBytes 1020 KBytes 0 Bytes 1 0 Bytes 0% 0
0x03be0000 1020 KBytes 1020 KBytes 0 Bytes 1 0 Bytes 0% 0
0x04a20000 2 MBytes 2 MBytes 0 Bytes 1 0 Bytes 0% 0
0x051e0000 4 MBytes 4 MBytes 0 Bytes 1 0 Bytes 0% 0
0x0c4b0000 8 MBytes 8 MBytes 0 Bytes 1 0 Bytes 0% 0
0x19dc0000 15.81 MBytes 15.78 MBytes 28 KBytes 1 28 KBytes -11928.57% Unavailable
0x1c3b0000 15.81 MBytes 15.81 MBytes 0 Bytes 1 0 Bytes 0% 0
0x2c900000 15.81 MBytes 15.81 MBytes 0 Bytes 1 0 Bytes 0% 0
..snip..
, где новые разделы, показанные внизу, отмеченные как 15,81 МБ, расширяются для дополнительных 46 новых сегментов и представляют 727,26 МБ утечки памяти в неуправляемых кучах.
Поиск по значению 15,81 МБ приводит меня к нескольким различным ссылкам, касающимся среды выполнения Microsoft VC:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/e7534d01-57ed-455c-bc0d-edb1b87d0f52/microsoft-vc-runtime-heap-fragmentation?forum=vclanguage
https://docs.microsoft.com/en-us/visualstudio/debugger/crt-debug-heap-details?view=vs-2019
Debugdiag показывает «кучу времени выполнения Microsoft VC», используя более 1 ГБ
Используя Windbg, я могу отобразить информацию о распределении относительно распределений, которая выглядит следующим образом:
61f130c8: 08008 . 10008 [101] - busy (10000) Internal
61f230d0: 10008 . 10008 [101] - busy (10000) Internal
61f330d8: 10008 . 10008 [101] - busy (10000) Internal
61f430e0: 10008 . 08008 [101] - busy (8000) Internal
61f4b0e8: 08008 . 10008 [101] - busy (10000) Internal
61f5b0f0: 10008 . 10008 [101] - busy (10000) Internal
Однако, поскольку они помечены как «Внутренние», они не участвуют в «трассировке стека» (опция -ust gflags) для определения фактического кода, который был выполнен для их распределения.
Может кто-нибудь направить меня к какой-либо дополнительной информации об этой утечке? В конечном итоге это приводит к сбою нашего приложения. Мне нужно что-нибудь, что может помочь мне определить метод, как мы можем повлиять на него, чтобы уменьшить или устранить эту утечку.