2016-10-03 9 views
3

Немного подробнее:Создать Minidump исключающего диапазон во время выполнения выделяется память

Я хотел создать файл дамп, используя MiniDumpWriteDump, но за исключением определенного диапазона воспоминаний, которые я выделенные в рамках модулей. Эти диапазоны памяти не важны для отладки, и они довольно большие (в основном текстуры).

Я прочитал документацию по функциям MiniDumpCallback и рассмотрел информацию, предоставленную структурой Input и Output. Ввод MiniDumpCallback позволяет мне решить, включать ли диапазон исполняемых изображений в память, а выход MiniDumpCallback позволяет мне выбрать диапазон для записи файла дампа.

Следовательно, мне интересно, можно ли создать MiniDump, исключая диапазон памяти, который был выделен для некоторых переменных, превышающих ограничение по размеру.

ответ

0

Операционная система выделяет память на страницах (обычно 4 kb), и только исключить целую страницу. Переменная может начинаться посередине страницы и заканчиваться посередине страницы. Другие переменные могут быть выделены до и после него. Таким образом, вы не можете исключать память на основе переменных.

Если переменная больше, чем страница, и она охватывает всю страницу, возможно, удастся исключить полные страницы. Тем не менее, это будет некоторая работа для вашей процедуры обратного вызова:

Позвольте мне предположить, что это вряд ли будет иметь структуру такого большого размера. Таким образом, единственной возможной переменной с таким размером будут массивы. Вы можете написать метод, который выделяет массивы и отслеживает массивы, которые охватывают всю страницу. Во время обратного вызова вы можете определить начало и конец страницы, используя GetSystemInfo(), а затем исключить страницы.

Несмотря на усилия, реализующего это, рассмотрим:

  • дискового пространства дешевы. Несколько МБ более или менее не имеют значения. Покупка диска дешевле, чем реализация такого поведения.
  • аварийные свалки сжимаются довольно хорошо (по крайней мере, те, которые я получаю). Если вам нужно отправить его, сначала введите его.
  • Если это еще не достаточно мало, вы можете преобразовать большой дамп в мини-накопитель (например, снова открыть дамп в WinDbg и .dump) и проанализировать этот первый. Только в случае необходимости клиент должен отправить вам более крупный файл.
  • удаленная отладка. Заказчик может, например, откройте дамп в WinDbg, запустите сервер отладки и вы можете подключиться к нему.
  • Для очень больших распределений менеджер кучи C++ напрямую вызовет VirtualAlloc(). Если область памяти больше 512 МБ, такие инструменты, как ProcDump, уже способны удалять наибольшее распределение (переключатель). (Но учтите, что ProcDump не будет входить в игру, если у вас есть собственный обработчик обработанных исключений)
Смежные вопросы