snapshot: find the correct binary name
authorBrian Norris <banorris@uci.edu>
Sat, 3 Nov 2012 22:31:20 +0000 (15:31 -0700)
committerBrian Norris <banorris@uci.edu>
Wed, 14 Nov 2012 22:26:40 +0000 (14:26 -0800)
This is somewhat of a neutral change; the existing /proc/*/maps check
works because our path name usually has the word 'model' in it. But
really, we should find the true, full path of the user program.

This should be extended to find more maps (e.g., for other libraries),
and it should be extended for Mac OSX too.

snapshot-interface.cc

index c22b871..51fe2f0 100644 (file)
@@ -12,7 +12,8 @@
 #include <inttypes.h>
 #include "common.h"
 
 #include <inttypes.h>
 #include "common.h"
 
-
+/* MYBINARYNAME only works because our pathname usually includes 'model' (e.g.,
+ * /.../model-checker/test/userprog.o) */
 #define MYBINARYNAME "model"
 #define MYLIBRARYNAME "libmodel.so"
 #define MAPFILE "/proc/self/maps"
 #define MYBINARYNAME "model"
 #define MYLIBRARYNAME "libmodel.so"
 #define MAPFILE "/proc/self/maps"
@@ -67,12 +68,22 @@ static void SnapshotGlobalSegments(){
        pclose(map);
 }
 #else
        pclose(map);
 }
 #else
+
+static void get_binary_name(char *buf, size_t len)
+{
+       if (readlink("/proc/self/exe", buf, len) == -1) {
+               perror("readlink");
+               exit(EXIT_FAILURE);
+       }
+}
+
 /** The SnapshotGlobalSegments function computes the memory regions
  *     that may contain globals and then configures the snapshotting
  *     library to snapshot them.
  */
 static void SnapshotGlobalSegments(){
        char buf[9000];
 /** The SnapshotGlobalSegments function computes the memory regions
  *     that may contain globals and then configures the snapshotting
  *     library to snapshot them.
  */
 static void SnapshotGlobalSegments(){
        char buf[9000];
+       char binary_name[800];
        FILE *map;
 
        map = fopen(MAPFILE, "r");
        FILE *map;
 
        map = fopen(MAPFILE, "r");
@@ -80,13 +91,14 @@ static void SnapshotGlobalSegments(){
                perror("fopen");
                exit(EXIT_FAILURE);
        }
                perror("fopen");
                exit(EXIT_FAILURE);
        }
+       get_binary_name(binary_name, sizeof(binary_name));
        while (fgets(buf, sizeof(buf), map)) {
                char regionname[200] = "";
                char r, w, x, p;
                void *begin, *end;
 
                sscanf(buf, "%p-%p %c%c%c%c %*x %*x:%*x %*u %200s\n", &begin, &end, &r, &w, &x, &p, regionname);
        while (fgets(buf, sizeof(buf), map)) {
                char regionname[200] = "";
                char r, w, x, p;
                void *begin, *end;
 
                sscanf(buf, "%p-%p %c%c%c%c %*x %*x:%*x %*u %200s\n", &begin, &end, &r, &w, &x, &p, regionname);
-               if (w == 'w' && (strstr(regionname, MYBINARYNAME) || strstr(regionname, MYLIBRARYNAME))) {
+               if (w == 'w' && (strstr(regionname, binary_name) || strstr(regionname, MYLIBRARYNAME))) {
                        size_t len = ((uintptr_t)end - (uintptr_t)begin) / PAGESIZE;
                        if (len != 0)
                                addMemoryRegionToSnapShot(begin, len);
                        size_t len = ((uintptr_t)end - (uintptr_t)begin) / PAGESIZE;
                        if (len != 0)
                                addMemoryRegionToSnapShot(begin, len);