Как получить доступ к блоку памяти при отладке из надстройки VS2010 - PullRequest
0 голосов
/ 31 марта 2012

Я создаю этот Addin-проект VS2010 в C #, который будет использоваться для отладки моих других проектов на c ++.Данные, которые я хочу обработать, хранятся в блоке памяти проекта c ++.В окне просмотра VS2010 я могу видеть массив памяти по выражению типа «& myobject, 100».

В моем проекте надстройки я пытаюсь использовать выражение «& myobject, 100», это только возвращает мне значениеадрес, такой же как "& myobject".Я ожидал массив байтов или любой другой способ получить этот блок памяти.

Глупый обходной путь - использовать цикл для получения каждого байта этой памяти с выражением "* (char *)& myobject [i] ", но это слишком медленно.

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

Спасибо

Ответы [ 2 ]

1 голос
/ 14 февраля 2014

Вы можете прочитать память отладчика с помощью Win32 API.Для этого вам нужно импортировать две функции kernel32.dll в ваш класс C #: ReadProcessMemory и OpenProcess

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
  IntPtr hProcess,
  IntPtr lpBaseAddress,
  [Out] byte[] lpBuffer,
  int dwSize,
  out int lpNumberOfBytesRead
 );

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[Flags]
enum ProcessAccessFlags : uint
{
  All = 0x001F0FFF,
  Terminate = 0x00000001,
  CreateThread = 0x00000002,
  VMOperation = 0x00000008,
  VMRead = 0x00000010,
  VMWrite = 0x00000020,
  DupHandle = 0x00000040,
  SetInformation = 0x00000200,
  QueryInformation = 0x00000400,
  Synchronize = 0x00100000
}

Идентификатор процесса можно получить из вашего экземпляра DTE и адреса памяти путем оценки & myobject.

int pid = _applicationObject.Debugger.CurrentProcess.ProcessID;
IntPtr phandle = OpenProcess((int)ProcessAccessFlags.VMRead, true, pid);
byte[] buffer = new byte[size];
int read;
ReadProcessMemory(phandle, (IntPtr)addr, buffer, (int)size, out read);

Имейте в виду, что это работает только в том случае, если ваш заемщик является 32-битным процессом.В противном случае вы можете использовать 64-битный вспомогательный процесс для чтения памяти вашего дебютанта (почему Visual Studio все еще 32-битный процесс?).Используйте сокеты для связи с этим процессом.

0 голосов
/ 31 марта 2012

Вы пытались посмотреть на окно «Память» с Debug -> Windows -> Memory?

...