windbg dds - не удается получить источник, где выделена память - PullRequest
0 голосов
/ 04 июля 2018

Я следую инструкциям на 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. Чтобы получить информацию об источнике, вы должны дополнительно включить кучу страниц на шаге 1 (gflags.exe / i MyApp.exe + ust + hpa) ...
  2. Сделайте! Heap -flt s [Размер]. [Размер] = AllocSize, определенный ранее. Эта команда выведет список всех блоков с этим конкретным размером.
  3. Выполните! Heap -p -a [UserAddr], чтобы получить трассировку стека, из которой вы выделили столько байтов. Используйте [UserAddr], который вы получили на предыдущем шаге
  4. Сделайте dt ntdll! _DPH_HEAP_BLOCK StackTrace [MyHeapBlockAddr], где [MyHeapBlockAddr] - это адрес DPH_HEAP_BLOCK, полученный на шаге 3.
  5. 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.

1 Ответ

0 голосов
/ 06 июля 2018

dds - это команда для d ump D WORD и интерпретируется как s tack. Это может работать для 32-битных приложений.

Ваше приложение является 64-битным приложением. Я могу видеть это по адресам вроде 00007ff7'b1400000, которые содержат обратную галочку. Таким образом, вы должны использовать dqs (сбрасывать четыре слова и интерпретировать как стек).

Еще лучше - dps (размер указателя дампа и интерпретировать как стек), поскольку он будет использовать 32 или 64 бит в зависимости от архитектуры вашего приложения.

...