From: Brian Norris <banorris@uci.edu>
Date: Tue, 29 May 2012 20:37:33 +0000 (-0700)
Subject: snapshot-interface: replace Subramanian's /proc/*/maps checking
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d6c724c262800ef1fedf964e18c44b8c423de63f;p=cdsspec-compiler.git

snapshot-interface: replace Subramanian's /proc/*/maps checking

Subramanian's code needed rewriting. It didn't actual snapshot any globals, and
it was also written so that it would never snapshot libmodel.so. I rewrite this
code and fix these problems, after Brian Demsky has fixed the problem with
dynamic linking of the HandlePF() code.
---

diff --git a/snapshot-interface.cc b/snapshot-interface.cc
index 2ef7e4b..4def5c8 100644
--- a/snapshot-interface.cc
+++ b/snapshot-interface.cc
@@ -10,73 +10,41 @@
 #include <cassert>
 #include <vector>
 #include <utility>
+#include <inttypes.h>
+
+#include "common.h"
 
 #define MYBINARYNAME "model"
 #define MYLIBRARYNAME "libmodel.so"
-#define PROCNAME      "/proc/*/maps"
-#define REPLACEPOS		6
-
-typedef std::basic_string<char, std::char_traits<char>, MyAlloc<char> > MyString;
+#define MAPFILE_FORMAT "/proc/%d/maps"
 
 SnapshotStack * snapshotObject;
 
-/*This looks like it might leak memory...  Subramanian should fix this. */
+void SnapshotGlobalSegments(){
+	int pid = getpid();
+	char buf[9000], filename[100];
+	FILE *map;
 
-typedef std::basic_stringstream< char, std::char_traits< char >, MyAlloc< char > > MyStringStream;
-std::vector< MyString, MyAlloc< MyString> > splitString( MyString input, char delim ){
-	std::vector< MyString, MyAlloc< MyString > > splits;
-	MyStringStream ss( input );	
-	MyString item;
-	while( std::getline( ss, item, delim ) ){
-		splits.push_back( item );	
+	sprintf(filename, MAPFILE_FORMAT, pid);
+	map = fopen(filename, "r");
+	if (!map) {
+		perror("fopen");
+		exit(EXIT_FAILURE);
 	}
-	return splits;
-}
+	while (fgets(buf, sizeof(buf), map)) {
+		char regionname[200] = "";
+		char r, w, x, p;
+		void *begin, *end;
 
-bool checkPermissions( MyString permStr ){
-	return permStr.find("w") != MyString::npos;
-}
-static void takeSegmentSnapshot( const MyString & lineText ){
-	std::vector< MyString, MyAlloc< MyString > > firstSplit = splitString( lineText, ' ' );
-	if( checkPermissions( firstSplit[ 1 ] ) ){
-		std::vector< MyString, MyAlloc< MyString > > secondSplit = splitString( firstSplit[ 0 ], '-' );    
-		size_t val1 = 0, val2 = 0;
-		sscanf( secondSplit[ 0 ].c_str(), "%zx", &val1 );
-		sscanf( secondSplit[ 1 ].c_str(), "%zx", &val2 );
-		size_t len = ( val2 - val1 ) / PAGESIZE;    
-		if( 0 != len ){
-			addMemoryRegionToSnapShot( ( void * )val1, len );        
+		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))) {
+			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);
 		}
 	}
-}
-void SnapshotGlobalSegments(){
-	MyString fn = PROCNAME;
-	static char sProcessSize[ 12 ] = { 0 };
-	std::pair< const char *, bool > dataSect[ 2 ];
-	dataSect[ 0 ] = std::make_pair( MYBINARYNAME, false );
-	dataSect[ 1 ] = std::make_pair( MYLIBRARYNAME, false );
-	static pid_t sProcID = 0;
-	if( 0 == sProcID ) {
-		sProcID = getpid();	
-		sprintf( sProcessSize, "%d", sProcID );
-	}
-	fn.replace( REPLACEPOS, 1, sProcessSize );
-	std::ifstream procName( fn.c_str() );
-	if( procName.is_open() ){
-		MyString line;
-		while( procName.good() ){
-			getline( procName, line );
-			int i;
-			for( i = 0; i < 2; ++i ){
-				if( MyString::npos != line.find( dataSect[ i ].first ) ) break;			
-			}
-			if( i >= 2 || dataSect[ i ].second == true ) continue;
-			dataSect[ i ].second = true;
-			if( !procName.good() )return;
-			getline( procName, line );
-			takeSegmentSnapshot( line );    
-		}	
-	}
+	fclose(map);
 }
 
 //class definition of SnapshotStack.....
@@ -85,10 +53,10 @@ SnapshotStack::SnapshotStack(){
 	SnapshotGlobalSegments();
 	stack=NULL;
 }
-	
+
 SnapshotStack::~SnapshotStack(){
 }
-	
+
 int SnapshotStack::backTrackBeforeStep(int seqindex) {
 	while(true) {
 		if (stack->index<=seqindex) {