2013-03-31 75 views
1

我有一个应用程序,我需要扫描内存中的某些数据类型。为了得到一些基准测试,我刮起了这个计划:C++内存扫描

long count = 0; 

MEMORY_BASIC_INFORMATION meminfo; 
unsigned char *addr = 0; 

HANDLE hProc = GetCurrentProcess(); 

while (true){ 

    if (VirtualQueryEx(hProc, addr, &meminfo, sizeof(meminfo)) == 0){ 

     break; 

    } 

    if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & WRITABLE)){ 

     addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize; 

     count++; 

     printf("%d",count); 

    } 

} 

printf("%ld\n",count); 

这个程序不工作在第一内存块,它块/崩溃。从概念上讲,它也失败了,理想情况下我需要指向当前流程中的所有变量,所以我可以检查它们是否与我有任何关联。我已经谷歌了一段时间无济于事,如果有人能把我推向正确的方向,那会很棒。

我知道首先这样做通常是一个坏主意,我只想知道如果我需要这样做会怎样做。

+0

可能只是用** **调试器可能是一个正确的方式),发现在程序B中的错误)执行任何类型的进程内存您希望通过您的程序实现的检查。另一方面,如果你只关心某种类型的基准测试,那么就有专门的工具,例如'gprof'。 – mikyra

+0

当你说它在第一个内存块崩溃时,你的意思是什么?你的意思是说调用VirtualQueryEx时出现错误?如果是这样,错误代码是什么? (您可以通过调用[GetLastError](http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx))来获取此信息。 –

回答

1

WRITEABLE(在第二个if块)不是内存保护常数之一。你的意思是PAGE_READWRITE?你可以找到完整的选项列表here

内存访问权限是棘手的。该功能的其余部分虽然工作。这工作,但可以通过加强的时候只能查看地址:

#include <Windows.h> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    long count = 0; 
    MEMORY_BASIC_INFORMATION meminfo; 
    unsigned char *addr = 0; 
    HANDLE hProc = GetCurrentProcess(); 
    while (true) 
    { 
     if (VirtualQueryEx(hProc, addr, &meminfo, sizeof(meminfo)) == 0) 
     { 
      // TODO GetLastError 
      break; 
     } 

     // if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & PAGE_READWRITE)) 
     { 
      addr = (unsigned char*) meminfo.BaseAddress + meminfo.RegionSize; 
      count++; 
      printf("%d", count); 
     } 
    } 

    printf("%ld\n", count); 
}