2010-11-11 3 views
26

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

Например, можно ли сохранять данные из окна памяти в VS до шестнадцатеричного дампа, но не как ASCII?

+0

Missing, что тоже было бы неплохо Аддин. – peterchen

ответ

5

Я не знаю, поможет ли это, но вы можете использовать команду .writemem WinDbg. Он принимает имя файла и диапазон памяти и выгружает его (как двоичный) на диск.

+0

Я считаю, что WinDbg нужно будет присоединить к процессу, но потому, что VS уже привязан к нему. В то время можно подключить только один отладчик, поэтому .writemem недоступен. См. [1] (http://stackoverflow.com/a/5590924/142207) и [2] (http://stackoverflow.com/a/8017023/142207) для других способов. – okigan

+0

Вы действительно можете подключить WinDbg к уже отлаживаемому процессу, но вам нужно проверить флажок «неинвазивный», когда вы это сделаете, и вы обнаружите, что некоторые параметры недоступны, и что ваш процесс VS скоро станет невосприимчивым. :) –

+0

Это также работает, если у вас есть свалка памяти в windbg. – Deanna

7

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

Windows: использовать несколько функций ReadProcessMemory/WriteProcessMemory. Она нуждается в автономное приложение, которое вызывает эти функции с целевой идентификатор процесса, как:

dumper.exe <debugged process id> <memory_start_addr> <memory_length> 

Это приложение можно назвать непосредственно во время сеанса отладки VS (по сравнению с Linux, которая не имеет такой возможности). Мы можем захватить адрес памяти в окне часов, затем передать адрес на самосвал и вуаля. Как говорит пользователь142207 в своей статье, он очень полезен в давно перекомпилированных проектах.

У Linux/MacOS разные подходы. Например: с консоли gdb используйте память дампа команды. Эта команда также может использоваться непосредственно во время сеанса отладки.

1

Окно часов в отладчике Visual Studio может запускать функции, если вы отлаживаете свой собственный код, вы можете просто добавить некоторую функцию в свой код для сохранения буфера в файл и вызвать его из окна просмотра. , например:

void WriteToFile(char* name, void* buffer, size_t size) 
{ 
    FILE* fp; 
    fopen_s(&fp, name, "wb"); 
    fwrite(buffer, 1, size, fp); 
    fclose(fp); 
} 

Тогда просто напечатайте что-то вроде этого в окне просмотра:

WriteToFile("c:\\temp\\dump.dat", buffer, len) 
2

Там есть расширение для этого: https://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugTool. Он открывает консоль в окне VisualStudio и позволяет сбрасывать память в файл и пару других операций с памятью (для получения дополнительной информации см. «Справка»).

Кроме того, некоторые шестнадцатеричные редакторы (например, Hex Editor Neo) могут просматривать память процесса как обычный файл. Возможно, вы также найдете бесплатный редактор с этой функцией.

0

Я подозреваю, что вы можете получить то, что хотите от ClrMD, тогда вы можете точно такие же данные, сколько хотите.

Если вы буквально хотите дамп ядра, то WinDbg может быть тем, что вы ищете?

Существует также этот пост на MSDN Blogs: https://blogs.msdn.microsoft.com/dondu/2010/10/24/writing-minidumps-in-c/

Он описывает, как создать дамп-иш вещи в .NET программно.

+0

Я знаю, что могу получить файл дампа всей доступной памяти, но я просто хочу получить фрагмент памяти в файл во время отладки без изменения исходного кода. – marsh

+0

@marsh Итак, вы хотите, чтобы внешняя программа Me проанализировала память и сохранила ее пополам? – BanksySan

+0

@marsh Я предположил, что вы работаете в .NET, работаете ли вы с неуправляемой памятью? – BanksySan

2

У StNickolay есть ответ, который ссылается на какой-то инструмент под названием «самосвал», но каким-то образом я не смог найти его по сети (также пользователь142207 давно ушел). Поэтому я создал тот же самый инструмент - он открывает запущенный процесс (даже при подключенном отладчике) и копирует часть его памяти в файл. Очень полезно, когда вы хотите сохранить некоторую структуру на более позднем этапе и не хотите бороться с выходом «Copy» VS Memory View. Наслаждайтесь!

https://github.com/Alexx999/Dumper

+0

Отличный материал! Просто использовал его, отлично. – TTimo

Смежные вопросы