Поиск строк в большом файле MEMORY.DMP

Как выполнить поиск строки в большом файле MEMORY.DMP, сгенерированном Windows BSOD (64-разрядная версия Windows 8.1)?

В 32-битной Windows команда

s -a 0 ffffffff "my pattern"

кажется, работает.

Но для 64-битных окон,

s -a 0 ffffffff`ffffffff "my pattern"

занимает почти бесконечное время, хотя общий размер MEMORY.DMP составляет всего около 400 МБ, в то время как простой grep может найти шаблон за секунды.

Моя цель - найти виртуальный адрес строки, чтобы определить, какая область стека/кучи/текста перезаписывается ею.

Наконец, я бы прибегнул к интерпретации формата файла MEMORY.DMP вручную, если доступна ссылка или спецификация формата файла. Любые подсказки?


person murali    schedule 02.09.2015    source источник
comment
Вы получаете много выводов, например. › 1000 адресов?   -  person Thomas Weller    schedule 02.09.2015
comment
@Thomas Я ничего не нашел при попытке выполнить команду s, а WinDbg просто продолжал поиск BUSY. На самом деле в дампе есть только один экземпляр шаблона. Я знаю, где он находится в файле, но не знаю, как перевести его в виртуальный адрес.   -  person murali    schedule 02.09.2015
comment
Да я вижу. В случае многих находок я заметил, что WinDbg настолько медленный, потому что ему нужно печатать все в своем графическом интерфейсе.   -  person Thomas Weller    schedule 02.09.2015
comment
Кстати, что-то похожее здесь работало хорошо, но это дамп пользовательского режима, а не дамп ядра. Может это зависит от версии WinDbg? Пробовали ли вы версию 10? На Win 7 тоже работает.   -  person Thomas Weller    schedule 02.09.2015
comment
@Thomas WinDbg «Версия 10» в ссылке, по-видимому, не содержит исполняемый файл, а только образцы и библиотеки после установки. Я попробовал последнюю версию WinDbg 6.3.9600.17298, и она показала такое же поведение. Я также пробовал решение, но оно тоже зависает.   -  person murali    schedule 03.09.2015
comment
x64 msi и x86 msi должен содержать отладчик, но ладно, версия 6.3 совсем недавно и должны сделать для этой цели.   -  person Thomas Weller    schedule 03.09.2015
comment
Не могли бы вы предоставить мне дамп, чтобы я мог воспроизвести проблему и (возможно) найти решение? При необходимости могу подписать NDA.   -  person Thomas Weller    schedule 17.09.2015
comment
@Thomas К сожалению, дампы памяти принадлежат нашему клиенту, и они довольно велики (8 ГБ).   -  person murali    schedule 21.09.2015


Ответы (1)


В настоящее время я делаю это так:

  1. !куча -а

Что обеспечит некоторый вывод, как показано ниже:

HEAPEXT: Unable to get address of ntdll!RtlpHeapInvalidBadAddress. Index   Address  Name      Debugging options enabled   1:   1b9be450000 
    Segment at 000001b9be450000 to 000001b9be54f000 (0008b000 bytes committed)   2:   1b9be1f0000 
    Segment at 000001b9be1f0000 to 000001b9be200000 (00001000 bytes committed)   3:   1b9bfe10000 
    Segment at 000001b9bfe10000 to 000001b9bfe1f000 (0000f000 bytes committed)
    Segment at 000001b9c3a40000 to 000001b9c3b3f000 (00005000 bytes committed)   4:   1b9be440000 
    Segment at 000001b9be440000 to 000001b9be44f000 (00007000 bytes committed)
  1. Ищите между начальным и конечным адресами каждого сегмента, пока не найдете свои данные.
  2. Например: s -a 000001b9be450000 000001b9be54f000 "мой шаблон"

Это может работать не во всех сценариях, но для меня это позволило мне найти данные, которые я искал.

person Malcolm McCaffery    schedule 29.04.2020