Я следую инструкциям на windbg.info, чтобы попытаться найти источник, соответствующий распределению / утечке памяти в моей программе. Я создал тестовый пример с утечкой кода, чтобы попытаться продемонстрировать это. Я могу пройти часть пути туда, но не могу увидеть фактический источник.
Код C ++, о котором идет речь, является отладочной сборкой (оптимизация отключена и т. Д.). Вызывается несколько раз.
class test
{
public:
int Allocate()
{
pai = new int[128];
pasz = new char[128];
}
private:
int * pai = nullptr;
char * pasz = nullptr;
};
Я следую указаниям на windbg.info (сокращенно):
- Чтобы получить информацию об источнике, вы должны дополнительно включить кучу страниц на шаге 1 (gflags.exe / i MyApp.exe + ust + hpa)
...
- Сделайте! Heap -flt s [Размер]. [Размер] = AllocSize, определенный ранее. Эта команда выведет список всех блоков с этим конкретным размером.
- Выполните! Heap -p -a [UserAddr], чтобы получить трассировку стека, из которой вы выделили столько байтов. Используйте [UserAddr], который вы получили на предыдущем шаге
- Сделайте dt ntdll! _DPH_HEAP_BLOCK StackTrace [MyHeapBlockAddr], где [MyHeapBlockAddr] - это адрес DPH_HEAP_BLOCK, полученный на шаге 3.
- Do dds [StackTrace] ", где [StackTrace] - значение, полученное на предыдущем шаге.
Обратите внимание, что dds выгрузит стек с включенной информацией об источнике.
У меня все символы загружены правильно:
00007ff7`b1400000 00007ff7`b142b000 ConsoleApplication1 C (private pdb symbols) c:\...
00007ff8`37ae0000 00007ff8`37c9e000 ucrtbased (private pdb symbols) c:\...
00007ff8`39d20000 00007ff8`39e16000 MSVCP140D (private pdb symbols) c:\...
00007ff8`40e30000 00007ff8`40e9e000 verifier (private pdb symbols) c:\...
00007ff8`40ec0000 00007ff8`40ee2000 VCRUNTIME140D (private pdb symbols) c:\...
00007ff8`6a410000 00007ff8`6a62d000 KERNELBASE (private pdb symbols) c:\...
00007ff8`6b4c0000 00007ff8`6b56c000 KERNEL32 (private pdb symbols) c:\...
00007ff8`6d9e0000 00007ff8`6dbb1000 ntdll (private pdb symbols) c:\...
Я вижу «хороший» стек, который показывает вызов test :: Allocate:
0:004> !heap -flt s 2034
_DPH_HEAP_ROOT @ 272d60e1000
Freed and decommitted blocks
DPH_HEAP_BLOCK : VirtAddr VirtSize
Busy allocations
DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize
00000272d60ecf70 : 00000272d6467fc0 0000000000002034 - 00000272d6467000 0000000000004000
0:004> !heap -p -a 00000272d6467fc0
address 00000272d6467fc0 found in
_DPH_HEAP_ROOT @ 272d60e1000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
272d60ecf70: 272d6467fc0 2034 - 272d6467000 4000
...
00007ff7b14142a8 ConsoleApplication1!test::Allocate+0x0000000000000048
00007ff7b141495a ConsoleApplication1!main+0x000000000000008a
...
Я думал, что смогу теперь получить источник этого выделения памяти:
0:004> dt ntdll!_DPH_HEAP_BLOCK StackTrace 00000272d60ecf70
+0x060 StackTrace : 0x00000272`d2f106d0 _RTL_TRACE_BLOCK
0:004> dds 0x00000272`d2f106d0
00000272`d2f106d0 00000000
00000272`d2f106d4 00000000
00000272`d2f106d8 00008804
...
Нет источника, хотя у меня установлен 'путь к исходному файлу'. Я не нашел примеров того, как выглядит успешное дело. Что-то не так в настройке среды или в командах?
windbg версия: 6.12.0002.633 драм64. Исполняемый файл x64.