pagemap_dump!

This commit is contained in:
Ciro Santilli
2017-07-15 12:37:21 +01:00
parent 105341b7ae
commit 1428e7a3b5

View File

@@ -17,7 +17,7 @@ Data sources: /proc/PIC/{map,pagemap}
#include <sys/types.h> #include <sys/types.h>
#define PAGE_SIZE 0x1000 #define PAGE_SIZE 0x1000
int main(int argc, char *argv[]) { int main(int argc, char **argv) {
char buffer[BUFSIZ]; char buffer[BUFSIZ];
char maps_file[BUFSIZ]; char maps_file[BUFSIZ];
char pagemap_file[BUFSIZ]; char pagemap_file[BUFSIZ];
@@ -26,7 +26,7 @@ int main(int argc, char *argv[]) {
int pagemap; int pagemap;
if (argc < 2) { if (argc < 2) {
printf("Usage: %s pid1\n", argv[0]); printf("Usage: %s pid\n", argv[0]);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
pid_t pid = (pid_t)strtoul(argv[1], NULL, 0); pid_t pid = (pid_t)strtoul(argv[1], NULL, 0);
@@ -50,6 +50,10 @@ int main(int argc, char *argv[]) {
for (size_t i = offset; i < (size_t)length; i++) { for (size_t i = offset; i < (size_t)length; i++) {
unsigned long low = 0, high = 0; unsigned long low = 0, high = 0;
if (buffer[i] == '\n' && i) { if (buffer[i] == '\n' && i) {
const char *lib_name;
size_t y;
/* Parse a line from maps. Each line contains a range that contains many pages. */
{
size_t x = i - 1; size_t x = i - 1;
while(x && buffer[x] != '\n') x --; while(x && buffer[x] != '\n') x --;
if (buffer[x] == '\n') x++; if (buffer[x] == '\n') x++;
@@ -78,17 +82,18 @@ int main(int argc, char *argv[]) {
} }
else break; else break;
} }
lib_name = 0;
const char *lib_name = 0;
for (int field = 0; field < 4; field++) { for (int field = 0; field < 4; field++) {
x++; x++;
while(buffer[x] != ' ' && x < sizeof buffer) x++; while(buffer[x] != ' ' && x < sizeof buffer) x++;
} }
while (buffer[x] == ' ' && x < sizeof buffer) x++; while (buffer[x] == ' ' && x < sizeof buffer) x++;
size_t y = x; y = x;
while (buffer[y] != '\n' && y < sizeof buffer) y++; while (buffer[y] != '\n' && y < sizeof buffer) y++;
buffer[y] = 0; buffer[y] = 0;
lib_name = buffer + x; lib_name = buffer + x;
}
/* Get info about all pages in this page range with pagemap. */
{ {
unsigned long data; unsigned long data;
for (unsigned long i = low; i < high; i += PAGE_SIZE) { for (unsigned long i = low; i < high; i += PAGE_SIZE) {
@@ -108,6 +113,7 @@ int main(int argc, char *argv[]) {
); );
} }
} }
buffer[y] = '\n';
} }
} }
} }