我試圖檢測使用C/C++編寫的每個訪問程序在運行時正在進行的操作,特別是動態分配的內存。另外,我想了解一些有關訪問權限的信息。訪問的函數名稱就是我正在尋找的。檢測每個由C/C++程序進行的內存訪問
例如,對於下面的代碼:
void MemoryAccess(int* my_vector) {
int x = my_vector[0]; // Read access from 0xFFFF0000.
my_vector[0] = x + 1; // Write access to 0XFFFF0000.
}
int main(void) {
// Assume that the address returned by malloc is 0xFFFF0000.
int* vec = malloc(VEC_SIZE * sizeof(int));
if (!vec) {
return MEMORY_ALLOCATION_FAIL;
}
MemoryAccess(vec);
int second_elem = vec[1]; // Read access from 0xFFFF0004.
v[1] = 10; // Write access to 0xFFFF0004.
return 0;
}
我想記錄一個日誌文件,包含以下內容:地址已被訪問,即取得了訪問函數名。對於上面的例子,我的日誌應該是這個樣子:
{Read} {MemoryAccess} {0xFFFF0000}
{Write} {MemoryAccess} {0xFFFF0000}
{Read} {main} {0xFFFF0004}
{Write} {main} {0xFFFF0004}
我已經能夠使用異常過濾器做在Windows這樣的事情,並修改監視內存塊的頁面保護。我無法獲得訪問該函數的名稱,只有在引發異常時才提供指令指針值,並且我無法知道如何使用它來獲取函數名稱。
注意:我的目標是監視基於Linux的系統(主要是Debian/Ubuntu)上的內存訪問,而不是Windows。
valgrind能幫助你嗎? – Angew
請提供該「C/C++」語言規範的鏈接。直到那時只有兩種不同的**語言C和C++。這不是C++。這兩種語言的問題都有不同的解決方案。 – Olaf
@Angew:我不認爲Valgrind會監控**每個**訪問。 – Olaf