Bug 303153 -  Live debug session is messed up after terminating snapshot launch session
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java
index 677f23f..f42e1d3 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java
@@ -21,12 +21,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
 import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
 import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
 import org.eclipse.cdt.debug.edc.symbols.IScope;
 import org.eclipse.core.runtime.IPath;
-import org.junit.After;
 import org.junit.Assert;
 
 /**
@@ -57,9 +55,5 @@
 		}
 		return scopes;
 	}
-	
-	@After
-	public void tearDown() throws Exception {
-		Symbols.shutdown();
-	}
+
 }
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
index ffd260c..f57011f 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.cdt.debug.edc.internal.services.dsf;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -52,7 +53,7 @@
 	/** TEMPORARY system property (value "true", default "false") for selecting the old DWARF reader */
 	public static final String DWARF_USE_OLD_READER = "dwarf.use_old_reader"; //$NON-NLS-1$
 	
-	private static Map<IPath, IEDCSymbolReader> readerCache = new HashMap<IPath, IEDCSymbolReader>();
+	private static Map<IPath, WeakReference<IEDCSymbolReader>> readerCache = new HashMap<IPath, WeakReference<IEDCSymbolReader>>();
 	private ISourceLocator sourceLocator;
 	
 	public ISourceLocator getSourceLocator() {
@@ -182,7 +183,11 @@
 
 	public static IEDCSymbolReader getSymbolReader(IPath modulePath) {
 
-		IEDCSymbolReader reader = readerCache.get(modulePath);
+		IEDCSymbolReader reader = null;
+		WeakReference<IEDCSymbolReader> cacheEntry = readerCache.get(modulePath);
+		
+		if (cacheEntry != null)
+			reader = cacheEntry.get();
 
 		if (reader != null) {
 			if (reader.getSymbolFile() != null
@@ -192,7 +197,7 @@
 			}
 
 			// it's been deleted or modified. remove it from the cache
-			readerCache.remove(reader);
+			readerCache.remove(modulePath);
 		}
 
 		IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(modulePath);
@@ -209,7 +214,7 @@
 		}
 
 		if (reader != null) {
-			readerCache.put(modulePath, reader);
+			readerCache.put(modulePath, new WeakReference<IEDCSymbolReader>(reader));
 		}
 		
 		return reader;
@@ -217,27 +222,10 @@
 
 	@Override
 	public void shutdown(RequestMonitor rm) {
-		// Shutdown all readers when this service is shutdown. This is overkill
-		// and will cause problems when more then one debug sessions is running,
-		// but is an temporary measure until we do some more work on the
-		// readers.
-		shutdown();
-
 		super.shutdown(rm);
 	}
 
 	/**
-	 * This is exposed only for testing.
-	 */
-	public static void shutdown() {
-		Collection<IEDCSymbolReader> readers = readerCache.values();
-		for (IEDCSymbolReader reader : readers) {
-			reader.shutDown();
-		}
-		readerCache.clear();
-	}
-
-	/**
 	 * A wrapper method that calls into symbol reader to get runtime address(es)
 	 * for a given function name. 
 	 * Currently this method use symbol table instead of debug info (e.g. dwarf2)