2012-03-30 4 views
0

私はこのVS2010アドインプロジェクトをC#で作成しています。これは他のC++プロジェクトのデバッグに使用されます。 処理したいデータは、C++プロジェクトのメモリブロックに格納されます。 VS2010ウォッチウィンドウでは、 "& myobject、100"のような式でメモリの配列を見ることができます。VS2010アドインからデバッグするときにメモリブロックにアクセスする方法

私のアドインプロジェクトでは、表現「& myobject、100」を使用しようとしましたが、これはアドレスの値を返すだけで、「& myobject」と同じです。私は、バイトの配列、またはメモリのブロックを取得するための他の方法を期待していた。

愚かな回避策は、ループを使って "*(char *)& myobject [i]"の式でそのメモリの各バイトを取得することですが、これは遅すぎます。

私の研究からは、メモリを読み込んでそのメモリのデータを含むオブジェクトを返すExpression Evaluatorを実装できるようです。どうやってするか?それを行う最も簡単な方法は何ですか? (最小限のインターフェースを実装するなど)。

おかげ

答えて

0

あなたはDebug -> Windows -> Memoryからメモリウォッチウィンドウを見てみましたか?

+0

Thanks tom。私はしましたが、それは私が推測する人間のデバッグ目的です。私がここでやろうとしているのは、メモリブロック内のデータを評価できるVS2010アドインを作成することです。これを実現する方法はわかりません。 – joeyzhao

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は、& 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ビットの処理ですか?)。ソケットを使用してこのプロセスと通信します。

+0

tofucoderありがとう、私はもはやその会社で働いていないし、以来VSに触れていない。それにもかかわらず、それが実行可能であることを知っているのは良いことです。 – joeyzhao