2012-03-30 62 views
0

我在C#中创建了此VS2010 Addin项目,该项目将用于调试其他C++项目。 我想要处理的数据存储在C++项目的一块内存中。 在VS2010监视窗口中,我可以通过类似“& myobject,100”的表达式来查看内存阵列。如何从VS2010插件进行调试时访问内存块

在我的插件项目中,我尝试使用表达式“& myobject,100”,这只返回地址值,与“& myobject”相同。我期待着一个字节数组,或任何其他方式让我的内存块。

愚蠢的解决方法是使用循环来获取该内存的每个字节的表达式“*(char *)& myobject [i]”,但这太慢了。

从我的研究中看来,我可以实现一个Expression评估器来读取内存并返回包含该内存数据的对象。怎么做?什么是最简单的方法来做到这一点? (实现最少量的接口等)。

感谢

回答

0

你有没有想看看内存监视窗口从Debug -> Windows -> Memory

+0

谢谢汤姆。我做了,但是这是为了我想要的人工调试目的。我想在这里做的是创建一个VS2010加载项,可以评估该块内存中的数据,我不知道如何实现这一点。 – joeyzhao 2012-04-02 20:53:47

1

您可以使用win32 API读取调试对象的内存。要做到这一点,你需要在你的C#类进口2个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 
} 

进程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 2014-03-12 21:50:12