#include <stdio.h>
#include <iostream>
#include <fstream>
typedef unsigned long long ULL;
static void find_vaddr_in_smaps(ULL vaddr) {
std::cout << "Vaddr to be searched for is " << std::hex << vaddr << std::endl;
// create a copy of /proc/self/smaps as reading this can be racy.
std::string cmd("rm -rf ./smaps_cpy_pcd");
system(cmd.c_str());
cmd = "cp -rf /proc/self/smaps ./smaps_cpy_pcd";
system(cmd.c_str());
const std::string smapsFileName("./smaps_cpy_pcd");
std::ifstream smapsStream;
smapsStream.open(smapsFileName.c_str());
if (!smapsStream.is_open()) {
std::cout << "Error: could not open file " << smapsFileName << std::endl;
return;
}
while (smapsStream.good()) {
std::string line;
getline(smapsStream, line);
ULL mapstart, mapend;
int rc = sscanf(line.c_str(), "%llx-%llx", &mapstart, &mapend);
if (rc == 2) {
std::cout << "Found range is " << std::hex << mapstart << ":" << std::hex << mapend << std::endl;
}
}
smapsStream.close();
}
int main()
{
int* A = (int*)malloc(1000 * sizeof(int));
*A = 10;
printf("Allocated int pointer(%llx) has value = %d\n", A, *A);
find_vaddr_in_smaps((ULL)A);
return 0;
}
从 smaps 打印我的地址和范围。 A* 的打印地址不在 smaps 打印的范围内..
Allocated int pointer(614c20) has value = 10
Vaddr to be searched for is 614c20
Found range is 400000:423000
Found range is 623000:624000
Found range is 624000:625000
Found range is 625000:647000
Found range is 7ffff6d57000:7ffff6d6e000
Found range is 7ffff6d6e000:7ffff6f6d000
Found range is 7ffff6f6d000:7ffff6f6e000
Found range is 7ffff6f6e000:7ffff6f6f000
Found range is 7ffff6f6f000:7ffff6f73000
Found range is 7ffff6f73000:7ffff6f75000
Found range is 7ffff6f75000:7ffff7175000
Found range is 7ffff7175000:7ffff7176000
Found range is 7ffff7176000:7ffff7177000
Found range is 7ffff7177000:7ffff71d7000
Found range is 7ffff71d7000:7ffff73d6000
Found range is 7ffff73d6000:7ffff73d7000
Found range is 7ffff73d7000:7ffff73d8000
Found range is 7ffff73d8000:7ffff759c000
Found range is 7ffff759c000:7ffff779b000
Found range is 7ffff779b000:7ffff779f000
Found range is 7ffff779f000:7ffff77a1000
Found range is 7ffff77a1000:7ffff77a6000
Found range is 7ffff77a6000:7ffff77aa000
Found range is 7ffff77aa000:7ffff79a9000
Found range is 7ffff79a9000:7ffff79aa000
Found range is 7ffff79aa000:7ffff79ab000
Found range is 7ffff79ab000:7ffff79b2000
Found range is 7ffff79b2000:7ffff7bb2000
Found range is 7ffff7bb2000:7ffff7bb3000
Found range is 7ffff7bb3000:7ffff7bb4000
Found range is 7ffff7bb4000:7ffff7bd8000
Found range is 7ffff7bd8000:7ffff7dd7000
Found range is 7ffff7dd7000:7ffff7dd8000
Found range is 7ffff7dd8000:7ffff7dd9000
Found range is 7ffff7dd9000:7ffff7ddb000
Found range is 7ffff7ddb000:7ffff7dfd000
Found range is 7ffff7ff4000:7ffff7ffa000
Found range is 7ffff7ffa000:7ffff7ffc000
Found range is 7ffff7ffc000:7ffff7ffd000
Found range is 7ffff7ffd000:7ffff7ffe000
Found range is 7ffff7ffe000:7ffff7fff000
Found range is 7ffffffdd000:7ffffffff000
Found range is ffffffffff600000:ffffffffff601000