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は、& MyObjectに評価して、DTEインスタンスとメモリアドレスから入手することができます。
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);
これは、Debianが32ビットプロセスである場合にのみ機能することに注意してください。それ以外の場合は、64ビットヘルパープロセスを使用して、あなたのdebugeeからメモリを読み込むことができます(なぜVisual Studioはまだ32ビットの処理ですか?)。ソケットを使用してこのプロセスと通信します。
Thanks tom。私はしましたが、それは私が推測する人間のデバッグ目的です。私がここでやろうとしているのは、メモリブロック内のデータを評価できるVS2010アドインを作成することです。これを実現する方法はわかりません。 – joeyzhao