我正在用C#创建这个VS2010 Addin项目,它将用于调试我的其他c ++项目。 我想要处理的数据存储在c ++项目的内存块中。 在VS2010观察窗口中,我可以通过类似“& myobject,100”的表达式看到内存数组。
在我的插件项目中,我尝试使用表达式“& myobject,100”,这只返回一个地址值,与“& myobject”相同。我期待一个字节数组,或任何其他方式让我得到那块内存。
这个愚蠢的解决方法是使用循环来获取该内存的每个字节,其表达式为“*(char *)& myobject [i]”,但这太慢了。
从我的研究中,看起来我可以实现一个Expression求值器来读取内存并返回包含该内存数据的对象。怎么做?最简单的方法是什么? (实现最少量的接口等)。
由于
答案 0 :(得分:1)
您可以使用win32 api读取调试对象的内存。为此,您需要在C#类中导入两个kernel32.dll函数: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
}
可以通过评估& myobject从您的DTE实例和内存地址获取进程ID。
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);
请注意,这只适用于您的debugee是32位进程的情况。否则,您可以使用64位辅助进程从您的debugee读取内存(为什么Visual Studio仍然是32位进程?)。使用套接字与此过程进行通信。
答案 1 :(得分:0)
您是否曾尝试从Debug -> Windows -> Memory
查看内存观察窗口?