Перейти к содержимому

Dump c что это

  • автор:

Что такое dump(памяти) процесса и как им воспользоваться?

Думаю, что С++ имеет участие в данном вопросе. Потому что большинство ПО и игр написаны на нём или на С-подобном языке. Поправьте, если это не так.

Вообще, интересовал вопрос: что такое дамп памяти процесса и как им пользоваться. Не ОС, а какой-нибудь программы или игры.

  • Правильно ли создавать дампы через диспетчер задач и есть другие способы, а нужны ли эти способы?
  • Можно ли получить полезную информацию с дампа памяти?
  • Какие еще есть инструменты для открытия и просмотра дампов?
  • Что же там содержится в этом «черном ящике» файла дампа?
  • Вопрос задан более двух лет назад
  • 5686 просмотров

Простой 2 комментария

  • Facebook
  • Вконтакте
  • Twitter

На C++ можно писать/читать память процесса. Допустим есть игра и в коде игры есть переменная со значением 100, который является нашим здоровьем. Это значение находиться на нашем ОЗУ и у него есть свой адрес. Зная адрес, На C++ можно получить это значение или изменить его. Например мы можем читать этот адрес и как только наше здоровье уменьшится переписать этот адрес со значением 100 и стать бессмертным. Таким образом пишутся читы для игр. Адреса бывают двух типов: обычные и базовые(pointer). Обычные меняются при каждом перезапуске игры, а базовый никогда не меняются. Обычные находить легко, а базовые сложно. Находят их через CheatEngine (после установки будет туториал с задачами по нахождению и изменению адреса на самой программе). Изучай WriteProcessMemory() и ReadProcessMemory(). Если что, обращайся, нечего делать.

P.S всё что я перечислил относится ко всем программам на любом языке с любой целью.

1.1 Что такое файл дампа

Файл дампа — это образ процесса в памяти, и состояние выполнения программы можно сохранить в файл дампа через отладчик;
Файл дампа используется разработчиками драйверов для отладки драйвера. Этот файл необходимо открывать с помощью специального программного обеспечения, такого как WinDbg, VisualStudio;
Когда наша программа выпускается, невозможно отслеживать ошибки в нашем собственном коде на клиенте, поэтому файл дампа особенно полезен для нас; мы можем использовать файл .dmp для поиска ошибок. Если ситуация воспроизводится, воспроизведите среду клиента (включая вызовы стека и т. Д.), Установите путь отладки исходного кода, и вы сможете найти инструкцию BUG.

1.2 Разработка файла дампа

В последние несколько лет аварийные дампы стали важной частью отладки. Аварийный дамп первого поколения обычно называется «полным пользовательским дампом», который содержит все содержимое виртуальной памяти процесса. Однако такие дампы часто бывают очень большими, поэтому их очень трудно отправить разработчикам в электронном виде или даже невозможно завершить.

В Windows XP Microsoft выпустила новый набор технологий аварийного дампа под названием «минидамп». Минидамп легко настроить. Согласно наиболее часто используемой конфигурации, минидамп включает только самую необходимую информацию, которая используется для восстановления стеков вызовов всех потоков отказавшего процесса и просмотра значений локальных переменных во время сбоя. Такие файлы дампа обычно очень маленькие (всего несколько килобайт). Поэтому его легко отправить разработчикам программного обеспечения в электронном виде. При необходимости минидамп может даже содержать больше информации, чем исходный аварийный дамп. Например, он может содержать информацию об объектах ядра, используемых процессом. Кроме того, DbgHelp.dll предоставляет общедоступный API для создания минидампов посредством программирования. Более того, его можно переиздать. Мы больше не можем полагаться на внешние инструменты.

минидамп можно настроить , Это также вызывает у нас вопрос: сколько информации о состоянии приложения можно сохранить, чтобы обеспечить эффективную отладку и чтобы файл минидампа был как можно меньше? К счастью, мы можем Через группу функций DbgHelp (MiniDumpWriteDump и MiniDumpCallback) управлять этими функциями может быть еще сложнее. В этой статье мы объясним, как использовать эти функции для создания мыслей, чтобы убедиться, что файлы достаточно малы, но могут быть эффективно отлажены. Также будет объяснено, какие данные следует включить в минидамп и как использовать общие отладчики (WinDbg и VS.NET) для просмотра этой информации.

2. Тип минидампа

Объявление функции MiniDumpWriteDump

Используйте эту функцию для создания простого минидампа

Как в этом примере указать, какие данные должны быть включены в минидамп? В основном зависит от четвертого параметра MINIDUMP_TYPE MiniDumpWriteDump. следующим образом:

Перечисление MINIDUMP_TYPE — это несколько флагов, которые позволяют нам контролировать, что содержит минидамп. Давайте посмотрим на содержание этих значений и на то, как их использовать.

MiniDumpNormal
MiniDumpNormal — это особый логотип. Его значение равно 0, что означает, что это значение всегда существует неявно, и его даже не нужно указывать явно. Следовательно, мы можем предположить, что этот тег представляет набор базовых наборов данных, которые всегда будут существовать в минидампе. Вы можете отфильтровать эти значения, указав определяемую пользователем функцию обратного вызова.
В следующей таблице показаны типы данных в сборе данных базы данных.

Действительно, базовая информация, заданная MiniDumpNormal, очень полезна. Мы можем найти проблемную инструкцию и проверить, как поток переходит в это состояние. Вы даже можете увидеть значения параметров функции и локальных переменных. Кроме того, эту информацию также можно использовать для отладки тупиковых ситуаций, потому что мы можем видеть стеки вызовов всех потоков и знать, чего они ждут.

При этом стоимость всей этой информации очень мала, а размер минидампа обычно не превышает 20 КБ. Основным фактором, влияющим на размер, является размер стека потоков — чем больше памяти они занимают, тем больше размер файла минидампа.

Однако, если проблема, которую нужно отладить, является более сложной, чем простые проблемы, такие как незаконный доступ или тупик, мы обнаружим, что информации, собранной флагом MiniDumpNormal, недостаточно. Нам может потребоваться просмотреть глобальные переменные, но в них их нет. Также может потребоваться просмотреть содержимое структуры, размещенной в куче, а минидамп не включает соответствующую информацию о куче. Когда нам нужно больше данных минидампа, нам нужно изучить другие члены MINIDUMP_TYPE.

MiniDumpWithFullMemory

Это может быть наиболее часто используемый флаг помимо MiniDumpNormal. Если этот флаг указан, минидамп будет содержать содержимое всех читаемых страниц в адресном пространстве процесса. Мы можем видеть всю память, выделенную приложением, что дает нам множество методов отладки. Вы можете просмотреть все данные, хранящиеся в стеке, куче и сегменте данных модуля. Вы даже можете видеть данные потоков и блоков среды процесса (Блок среды процесса и Болк среды потока, PEB и TEB). Эти нераскрытые структуры данных могут оказать неоценимую помощь в нашей отладке.

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

MiniDumpWithPrivateReadWriteMemory

Если этот флаг указан, минидамп будет включать содержимое всех доступных для чтения и записи страниц частной памяти. Это позволяет нам просматривать стек, кучу и даже данные TLS. PEB и TEB также включены.

В настоящее время минидамп не включает содержимое общей памяти. Другими словами, мы не можем просматривать содержимое файла с отображением памяти. Точно так же не включаются сегменты кода и данных исполняемого модуля. Исключение сегмента кода означает, что дамп не занимает лишнего места. Однако у нас нет возможности просмотреть значение глобальных переменных.

В любом случае, благодаря объединению некоторых других параметров, MiniDumpWithPrivateReadWriteMemory является очень полезным вариантом. Посмотрим позже.

MiniDumpWithIndirectlyReferencedMemory

Если этот флаг указан, MiniDumpWriteDump проверяет каждый указатель в памяти стека потоков. Эти указатели могут указывать на другие читаемые страницы памяти в адресном пространстве потока. Как только такой указатель будет найден, программа прочитает 1024 байта рядом с указателем и сохранит его в минидампе (256 байтов до указателя и 768 байтов после указателя).

3. C ++ создает файл дампа.

Когда программа встречает необработанное исключение (в основном вызванное не-указателем), вызывающее сбой программы, если оно вызывается до возникновения исключения Функция SetUnhandledExceptionFilter () , Исключение передается функции для обработки. Поэтому добавьте функцию SetUnhandledExceptionFilter () в начале программы и используйте соответствующий метод для создания файла дампа в функции для достижения требуемых функций.

3.1 Откройте для создания файла дампа

Для функции SetUnhandledExceptionFilter () возвращаемое значение имеет три случая
EXCEPTION_EXECUTE_HANDLER equ 1 означает, что я обработал исключение и могу корректно завершить его
EXCEPTION_CONTINUE_SEARCH = 0 означает, что я не обрабатываю его, поэтому Windows вызывает обработчик по умолчанию для отображения окна ошибки и завершения
EXCEPTION_CONTINUE_EXECUTION equ -1 указывает, что ошибка исправлена, продолжайте выполнение с того места, где возникло исключение

Variable Dumping in C++

Is it possible to do a ‘dump’ on complex structures or even arrays in C++, in order to visually be able to check out what they’ve got inside them?

I’m thinking of something similar to print_r() or var_dump() in PHP.

7 Answers 7

The short answer is: no, unless you manually write such a routine yourself.

Which is often not a bad idea, but it has the usual problems of getting out of sync with the class if you are adding/changing members often. This is unavoidable because C++ lacks any form of introspection into struct s.

If you decide to go that way, the best thing to do is to write an overload for std::ostream& operator<<(std::ostream& os, MyClass const&) , which will enable your class to be printed to any IOStreams output stream.

Usually debuggers are smart enough to do this.

In GDB you can use:

and in NTSD you can do the uber-cool:

If you’re just using this for debugging purposes, I highly recommend learning to use the debuggers. Even if its something you want to log as you (i.e. print a zillion times) you can set a breakpoint macro.

And I’m sure there is a way to do it in GDB as well

In addition to the other answers, depending on what you want it for and whether you care about portability, you can potentially look at getting the information you need from the debugging information that your compiler generates. You can parse the COFF/ELF/whatever format file from the build and this gives you the information you need to work out the names and types of the variables in your object.

If you add reflection to C++ (using a third-party library or vendor extensions), you can write a routine to use that reflection data to dump arbitrary structures. For example, I have some code that uses CERN’s Reflex library to iterate over a class or structure’s members and dump them to YAML.

Josh Kelley's user avatar

Not generally possible in C++ as it requires the use of reflection, which C++ does not have. You can of course write your own function to dump specific data structures.

Indeed, in an environment where you have gdb at your disposal and you compile your sources with debugging symbols enabled (e.g -ggdb) you can have your debugger (e.g. gdb from commandline or ddd when you want something graphically).

Consider this piece of code:

When asking gdb politely it can give me the following output:

Edit: note that this data is available from a debugger context, for generating these dumps at runtime you will need to foresee your own dumping/formatting function, typically done by overloading the << operator in C++.

Name already in use

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

ObjectDumper is a utility which aims to serialize C# objects to string for debugging and logging purposes.

Download and Install ObjectDumper.NET

This library is available on NuGet: https://www.nuget.org/packages/ObjectDumper.NET/ Use the following command to install ObjectDumper using NuGet package manager console:

You can use this library in any .NET project which is compatible to PCL (e.g. Xamarin Android, iOS, Windows Phone, Windows Store, Universal Apps, etc.)

The Purpose of ObjectDumper

Serialization, the process of converting a complex object to a machine-readable or over-the-wire transmittable string, is a technique often used in software engineering. A well-known serializer is Newtonsoft.JSON which serializes .NET objects to the data representation format JSON.

ObjectDumper.NET provides two excellent ways to visualize in-memory .NET objects:

  • DumpStyle.Console: serialize objects to human-readable strings, often used to write complex C# objects to log files.
  • DumpStyle.CSharp: serialize objects to C# initializer code, which can be used to compile a C# object again.

Dumping C# Objects to Console.WriteLine

The following sample program uses DumpStyle.Console to write C# objects to the console output:

Dumping C# initializer code from in-memory objects to Console.WriteLine

The following sample program uses DumpStyle.CSharp to write C# initializer code from in-memory to the console output:

This project is Copyright © 2022 Thomas Galliker. Free for non-commercial use. For commercial use please contact the author.

About

ObjectDumper is a utility which aims to serialize C# objects to string for debugging and logging purposes.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *