Создайте MiniDump, исключая диапазон памяти, выделенной во время выполнения

Немного больше информации:

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

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

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

3

Решение

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

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

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]