2013-03-31 139 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); 
}