Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/66: Рейтинг темы: голосов - 66, средняя оценка - 4.56
 Аватар для moverast
8 / 10 / 0
Регистрация: 30.04.2011
Сообщений: 199
.NET 4.x

Сохранить дамп памяти процесса в файл

12.01.2012, 12:08. Показов 13916. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста как на C# (Visual Studio 2010. FW 4.0) сохранить в файл дамп памяти процесса?
мне нужно сделать аналог функции в диспетчере задач "Создать файл дампа памяти".
как альтернатива можете подсказать как сделать дамп из командной строки(cmd).
PS: без привлечения сторонних программ, то есть средствами операционной системы(Windows 7/Server 2008 R2).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2012, 12:08
Ответы с готовыми решениями:

Как по хэндлу процесса сделать дамп его памяти и записать его в файл?
Имеем VB 5.0. Есть чужое приложение на дельфи. Нужно сохранить в файл область память этого чужого приложения. Понятно, что это будет мною...

Как получить дамп памяти программы, чтоб потом можно было его сохранить и проанализировать?
Ну тут собственно есть нюансы: 1. Как собственно получить сам дамп. То есть это скорее всего должен быть дамп виртуального адресного...

Как можно прочесть сохраненный в файл дамп памяти с помощью средств Delphi?
подскажите как можно прочесть сохраненный в файл дамп памяти с помощью средств delphi.аналог утилиты BlueScreenView

11
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
12.01.2012, 12:41
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

вот здесь есть что-то подобное http://brakertech.com/howto-c-... -on-crash/ и здесь http://pinvoke.net/default.asp... pWriteDump
0
 Аватар для moverast
8 / 10 / 0
Регистрация: 30.04.2011
Сообщений: 199
12.01.2012, 12:44  [ТС]
DllImport("dbghelp.dll")]
сторонняя библиотека используется (((
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
12.01.2012, 12:46
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

она не сторонняя, эта библиотека системная (Windows\System32) и есть на всех компьютерах с ОС Windows.
0
40 / 40 / 3
Регистрация: 08.01.2012
Сообщений: 96
12.01.2012, 12:55
Что то примерно так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 _process = new Process ();
 
            ........................
 
            _process.StartInfo.RedirectStandardOutput = true;
            _process.StartInfo.RedirectStandardError = true; 
          
            _process.StartInfo.CreateNoWindow = true;
 
            _process.OutputDataReceived+=new DataReceivedEventHandler(_process_OutputDataReceived);
            _process.ErrorDataReceived+=new DataReceivedEventHandler(_process_ErrorDataReceived);
 
            _process.StartInfo.UseShellExecute = false;        
 
            _process.Start();
        
            _process.BeginOutputReadLine();
 
 
  void _process_OutputDataReceived(object sender, DataReceivedEventArgs e)
       {
            try 
    {
 
                e.Data - тескт потока
            
            }
            catch(Exception ex){
            }
 
        }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.01.2012, 12:58
Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication29
{
    class Program
    {
        [Flags]
        enum MINIDUMP_TYPE : uint
        {
            MiniDumpNormal = 0x00000000,
            MiniDumpWithDataSegs = 0x00000001,
            MiniDumpWithFullMemory = 0x00000002,
            MiniDumpWithHandleData = 0x00000004,
            MiniDumpFilterMemory = 0x00000008,
            MiniDumpScanMemory = 0x00000010,
            MiniDumpWithUnloadedModules = 0x00000020,
            MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
            MiniDumpFilterModulePaths = 0x00000080,
            MiniDumpWithProcessThreadData = 0x00000100,
            MiniDumpWithPrivateReadWriteMemory = 0x00000200,
            MiniDumpWithoutOptionalData = 0x00000400,
            MiniDumpWithFullMemoryInfo = 0x00000800,
            MiniDumpWithThreadInfo = 0x00001000,
            MiniDumpWithCodeSegs = 0x00002000,
            MiniDumpWithoutAuxiliaryState = 0x00004000,
            MiniDumpWithFullAuxiliaryState = 0x00008000,
            MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
            MiniDumpIgnoreInaccessibleMemory = 0x00020000,
            MiniDumpWithTokenInformation = 0x00040000
        };
 
        [DllImport( "DbgHelp.dll", SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        static extern bool MiniDumpWriteDump (
            IntPtr hProcess,
            int ProcessId,
            IntPtr hFile,
            MINIDUMP_TYPE DumpType,
            IntPtr ExceptionParam,
            IntPtr UserStreamParam,
            IntPtr CallbackParam
            );
 
        static void Main ( string[] args )
        {
            using ( var process = Process.GetProcessesByName( "idaq" )[0] )
            using ( var file    = File.Open( "mem.dmp", FileMode.Create, FileAccess.Write ) )
            {
                var dumpType = MINIDUMP_TYPE.MiniDumpNormal;
 
                if ( !MiniDumpWriteDump(
                        process.Handle, process.Id, file.Handle,
                        dumpType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero )
                    )
                    throw new Win32Exception( Marshal.GetLastWin32Error() );
            }
        }
    }
}
Это самый простой вариант. Также можно сделать дамп полностью самому используя ReadProcessMemory и VirtualQueryEx.

Добавлено через 1 минуту
Не заметил, _lunar_ уже дал ссылку на подобное...
3
 Аватар для moverast
8 / 10 / 0
Регистрация: 30.04.2011
Сообщений: 199
12.01.2012, 13:02  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
Также можно сделать дамп полностью самому используя ReadProcessMemory и VirtualQueryEx.
а вот это уже очень интересно. как это сделать?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.01.2012, 13:07
moverast, Вы хотите готовый код? Может сначала сами попробуете, а мы уж поможем если что...

Предложенный _lunar_ способ использует стандартные возможности ОС, Вам его хватит сполна, не стоит изобретать велосипеды.
0
 Аватар для moverast
8 / 10 / 0
Регистрация: 30.04.2011
Сообщений: 199
12.01.2012, 13:30  [ТС]
предложенный код создает минидамп, а мне нужен полный.
мне нужно сделать аналог функции в диспетчере задач "Создать файл дампа памяти".
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.01.2012, 13:48
Цитата Сообщение от moverast Посмотреть сообщение
предложенный код создает минидамп, а мне нужен полный.
TaskMgr создает минидамп, с параметром DumpType == 0x1826
C#
1
2
3
4
5
var dumpType = (MINIDUMP_TYPE)0x1826;
/* MINIDUMP_TYPE.MiniDumpWithFullMemory | MINIDUMP_TYPE.MiniDumpWithHandleData |
    MINIDUMP_TYPE.MiniDumpWithUnloadedModules | MINIDUMP_TYPE.MiniDumpWithFullMemoryInfo |
    MINIDUMP_TYPE.MiniDumpWithThreadInfo;
*/
Assembler
1
2
3
4
5
6
7
8
.text:00C835F9 push    edi                             ; CallbackParam
.text:00C835FA push    edi                             ; UserStreamParam
.text:00C835FB push    edi                             ; ExceptionParam
.text:00C835FC push    1826h                           ; DumpType
.text:00C83601 push    dword ptr [esi+8]               ; hFile
.text:00C83604 push    dword ptr [esi]                 ; ProcessId
.text:00C83606 push    dword ptr [esi+4]               ; hProcess
.text:00C83609 call    _MiniDumpWriteDump@28           ; MiniDumpWriteDump(x,x,x,x,x,x,x)
0
 Аватар для moverast
8 / 10 / 0
Регистрация: 30.04.2011
Сообщений: 199
13.01.2012, 09:18  [ТС]
на самом деле все проще простого! еще в примере забывали закрыть файловый поток.
если сократить код - вообще не страшно становится:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
        //импорт библиотеки из операционной системы для создания дампа памяти
        [DllImport("dbghelp.dll")]
        public static extern bool MiniDumpWriteDump(IntPtr hProcess, Int32 ProcessId, IntPtr hFile, int DumpType, IntPtr ExceptionParam, IntPtr UserStreamParam, IntPtr CallackParam);
 
        private void button1_Click(object sender, EventArgs e)
        {
                using (FileStream fs = new FileStream(@"C:\firefox.dmp", FileMode.Create))
                {
                    foreach (Process pr in Process.GetProcessesByName("firefox"))
                        MiniDumpWriteDump(pr.Handle, pr.Id, fs.SafeFileHandle.DangerousGetHandle(), 0x1826, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    fs.Close();
                }
        }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.01.2012, 16:48
moverast, прочитайте про using. После прочтения поймёте, что в моем примере FileStream закрывается, а в Вашем fs.Close совершенно не нужен.
Цитата Сообщение от moverast Посмотреть сообщение
если сократить код - вообще не страшно становится:
Там и так ничего страшного, а Ваш код менее читабелен для других людей, чем мой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2012, 16:48
Помогаю со студенческими работами здесь

Чтение из памяти стороннего процесса и запись в файл массива типа doouble
Здравствуйте. Помогите кто может) В общем надо написать прогу которая будет читать мой массив из Visual Studio 2010 во время отладки (то...

Сохранить файл в памяти телефона, доступной из диспетчера файлов или на ПК
Доброго времени суток. Мне необходимо сохранять некоторые файлы в публичной области памяти телефона (НЕ внешней, т.к. внешней памяти...

Чтение памяти другого процесса по таймеру: нужно ли закрывать хэндл процесса?
В моём варианте работает так: По таймеру (0,1 сек) определяю ID процесса по ехе-шнику, получаю хэндл процесса(открываю процесс) ...

Дамп процесса
Доброго времени суток!!!Возникла такая задача - необходимо снять дамп памяти исполняемого процесса(любого, но только одного,а не всех), так...

Дамп процесса в exe?
Как "превратить" запущенную программу в exe, чтобы можно было просто ее запустить и продолжить работу. Например как режим гибернации прячет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru