从VS2010插件调试时如何访问内存块

时间:2012-03-30 20:17:14

标签: visual-studio-2010 visual-studio-addins

我正在用C#创建这个VS2010 Addin项目,它将用于调试我的其他c ++项目。 我想要处理的数据存储在c ++项目的内存块中。 在VS2010观察窗口中,我可以通过类似“& myobject,100”的表达式看到内存数组。

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

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

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

由于

2 个答案:

答案 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查看内存观察窗口?