如何在Windows上創建系統或庫調用,以瞭解運行C程序的程序的內存使用情況?在windows下使用c語言的程序以字節爲單位的內存
1
A
回答
0
看看使用GetProcessMemoryInfo
這個例子:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1
void PrintMemoryInfo(DWORD processID)
{
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS pmc;
// Print the process identifier.
printf("\nProcess ID: %u\n", processID);
// Print information about the memory usage of the process.
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID);
if (NULL == hProcess)
return;
if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
{
printf("\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount);
printf("\tPeakWorkingSetSize: 0x%08X\n",
pmc.PeakWorkingSetSize);
printf("\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize);
printf("\tQuotaPeakPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakPagedPoolUsage);
printf("\tQuotaPagedPoolUsage: 0x%08X\n",
pmc.QuotaPagedPoolUsage);
printf("\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakNonPagedPoolUsage);
printf("\tQuotaNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaNonPagedPoolUsage);
printf("\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage);
printf("\tPeakPagefileUsage: 0x%08X\n",
pmc.PeakPagefileUsage);
}
CloseHandle(hProcess);
}
int main(void)
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
{
return 1;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded/sizeof(DWORD);
// Print the memory usage for each process
for (i = 0; i < cProcesses; i++)
{
PrintMemoryInfo(aProcesses[i]);
}
return 0;
}
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050(v=vs.85).aspx
2
這在很大程度上取決於你的意思是由該程序使用的內存的內容。只是一個明顯的例子,Windows DLL映射到幾乎所有程序的地址空間。你認爲程序使用的內存與否?如果有兩個(或更多)程序正在運行,它自己的可執行文件(以及任何DLL)通常也會映射到所有這些進程。同時,其中很大一部分可能只是地址空間 - 尚未使用的代碼可能根本無法加載到物理內存中。
所有這一切說,這裏是一個程序,將遍歷指定進程的內存塊並轉儲出有關它們的信息。根據進程所使用的內存的含義,您可能(例如)正在尋找標記爲Private
的塊。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
unsigned long usage;
void show_modules(HANDLE process) {
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for (p = NULL;
VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
p += info.RegionSize)
{
printf("%#10.10x (%6uK)\t", info.BaseAddress, info.RegionSize/1024);
switch (info.State) {
case MEM_COMMIT:
printf("Committed");
break;
case MEM_RESERVE:
printf("Reserved");
break;
case MEM_FREE:
printf("Free");
break;
}
printf("\t");
switch (info.Type) {
case MEM_IMAGE:
printf("Code Module");
break;
case MEM_MAPPED:
printf("Mapped ");
break;
case MEM_PRIVATE:
printf("Private ");
}
printf("\t");
if ((info.State == MEM_COMMIT) && (info.Type == MEM_PRIVATE))
usage +=info.RegionSize;
int guard = 0, nocache = 0;
if (info.AllocationProtect & PAGE_NOCACHE)
nocache = 1;
if (info.AllocationProtect & PAGE_GUARD)
guard = 1;
info.AllocationProtect &= ~(PAGE_GUARD | PAGE_NOCACHE);
switch (info.AllocationProtect) {
case PAGE_READONLY:
printf("Read Only");
break;
case PAGE_READWRITE:
printf("Read/Write");
break;
case PAGE_WRITECOPY:
printf("Copy on Write");
break;
case PAGE_EXECUTE:
printf("Execute only");
break;
case PAGE_EXECUTE_READ:
printf("Execute/Read");
break;
case PAGE_EXECUTE_READWRITE:
printf("Execute/Read/Write");
break;
case PAGE_EXECUTE_WRITECOPY:
printf("COW Executable");
break;
}
if (guard)
printf("\tguard page");
if (nocache)
printf("\tnon-cachable");
printf("\n");
}
}
int main(int argc, char **argv) {
int pid;
if (argc != 2) {
fprintf(stderr, "Usage: %s <process ID>", argv[0]);
return 1;
}
sscanf(argv[1], "%i", &pid);
HANDLE process = OpenProcess(
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
false,
pid);
show_modules(process);
printf("Total memory used: %luKB\n", usage/1024);
return 0;
}
相關問題
- 1. 以字節爲單位的已用內存。 Linux堆塊大小
- 2. 在C簡單的「Hello World」內聯彙編語言程序/ C++
- 3. Linux進程內存消耗(以字節爲單位)(非千字節)
- 4. 行爲的在64位Windows(內存)32個應用程序
- 5. 使用C#作爲C#應用程序的腳本語言
- 6. 在Windows下使用C++的UTC時間戳(以毫秒爲單位)
- 7. 如何使用C語言中的單元測試語言C?
- 8. 用於生成單個EXE Windows應用程序的語言?
- 9. 以字節爲單位調用索引
- 10. 根據所選語言以塊爲單位查看內容
- 11. 將字節序列移位N位。彙編語言
- 12. 使用匯編語言查找變量的內存位置
- 13. 整個程序的內存字節數
- 14. 如何將英語單詞轉換爲使用c語言的本地語言
- 15. 純C語言的iPhone應用程序
- 16. Windows上C++應用程序的內存使用情況
- 17. 使用Visual Studio以不同語言運行C#應用程序
- 18. 分配受控內存 - 以字節爲單位的數組大小
- 19. Howto安裝多語言winforms應用程序的單一語言
- 20. 單一語言的多語言應用程序?
- 21. 可以以編程方式安裝Windows Phone語言語言嗎?
- 22. 在C#中的應用程序的內存問題Windows窗體
- 23. 使用C語言監視Windows操作系統的進程
- 24. 如何在Windows上爲C++程序設置正確的初始語言環境?
- 25. 是否可以在Linux,C語言中不使用任何系統調用的情況下監視內存?
- 26. 使用特定於C語言的數據結構和算法的內存數據庫編程語言
- 27. 如何獲得C++在Windows下的內存使用情況
- 28. 我可以使用C++作爲Windows Phone 8的全功能開發語言嗎?
- 29. C#:使用英文以外的語言字典的問題
- 30. 多語言應用程序內的替換字段
我覺得這個代碼是過程的代碼,但我需要通過像我有打印的使用了多少時間來執行程序,所以我想KNW我可以打印我的C語言程序中使用的存儲器中的代碼它所使用的內存...... – 2012-01-18 18:52:44
是的,你將程序與這個程序分開運行,然後運行該程序並在列表中查找你的程序。 – Tim 2012-01-18 19:05:58
但我需要嵌入的東西 – 2012-01-18 19:10:47