2012-03-30 3 views
0

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

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

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

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

Благодаря

ответ

0

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

+0

Спасибо tom. Я сделал, но это для человеческой отладки цели, я думаю. То, что я пытаюсь сделать здесь, - создать надстройку VS2010, которая может оценивать данные в этом блоке памяти, я не знаю, как это достичь. – joeyzhao

1

Вы можете прочитать память debuggee с помощью 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 
} 

Процесс ID может быть получен из экземпляра 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

Благодаря tofucoder, я больше не работаю в этой компании и не касаюсь VS с тех пор. тем не менее, хорошо знать, что это выполнимо, возможно, когда я вернусь на C#. – joeyzhao