X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=snapshot-interface.cc;h=cece58d0d10240c813b1be515ddc1e33825a7a47;hp=4def5c88c56d7baa2e1f44bec06c9680671a4779;hb=18fb657b0c6f8abfe4048e5252a9ffab960acabc;hpb=4568d21526e5c3c79cb99eea8277a5fef9127283 diff --git a/snapshot-interface.cc b/snapshot-interface.cc index 4def5c88..cece58d0 100644 --- a/snapshot-interface.cc +++ b/snapshot-interface.cc @@ -11,15 +11,62 @@ #include #include #include - #include "common.h" + #define MYBINARYNAME "model" #define MYLIBRARYNAME "libmodel.so" #define MAPFILE_FORMAT "/proc/%d/maps" SnapshotStack * snapshotObject; +#ifdef MAC +void SnapshotGlobalSegments(){ + int pid = getpid(); + char buf[9000], execname[100]; + FILE *map; + + sprintf(execname, "vmmap -interleaved %d", pid); + map=popen(execname, "r"); + + if (!map) { + perror("popen"); + exit(EXIT_FAILURE); + } + + /* Wait for correct part */ + while (fgets(buf, sizeof(buf), map)) { + if (strstr(buf, "==== regions for process")) + break; + } + + while (fgets(buf, sizeof(buf), map)) { + char regionname[200] = ""; + char type[23]; + char smstr[23]; + char r, w, x; + char mr, mw, mx; + int size; + void *begin, *end; + + //Skip out at the end of the section + if (buf[0]=='\n') + break; + + sscanf(buf, "%22s %p-%p [%5dK] %c%c%c/%c%c%c SM=%3s %200s\n", &type, &begin, &end, &size, &r, &w, &x, &mr, &mw, &mx, smstr, regionname); + + if (w == 'w' && (strstr(regionname, MYBINARYNAME) || strstr(regionname, MYLIBRARYNAME))) { + printf("%s\n", buf); + + size_t len = ((uintptr_t)end - (uintptr_t)begin) / PAGESIZE; + if (len != 0) + addMemoryRegionToSnapShot(begin, len); + DEBUG("%45s: %18p - %18p\t%c%c%c%c\n", regionname, begin, end, r, w, x, p); + } + } + pclose(map); +} +#else void SnapshotGlobalSegments(){ int pid = getpid(); char buf[9000], filename[100]; @@ -46,6 +93,7 @@ void SnapshotGlobalSegments(){ } fclose(map); } +#endif //class definition of SnapshotStack..... //declaration of constructor....