diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py
index bab338c..329b1c3 100755
--- a/lldb/examples/python/crashlog.py
+++ b/lldb/examples/python/crashlog.py
@@ -33,6 +33,7 @@
 import plistlib
 #import pprint # pp = pprint.PrettyPrinter(indent=4); pp.pprint(command_args)
 import re
+import shlex
 import sys
 import time
 import uuid
@@ -245,7 +246,7 @@
         
     def __init__(self, path):
         """CrashLog constructor that take a path to a darwin crash log file"""
-        self.path = path;
+        self.path = os.path.expanduser(path);
         self.info_lines = list()
         self.system_profile = list()
         self.threads = list()
@@ -253,8 +254,14 @@
         self.idents = list() # A list of the required identifiers for doing all stack backtraces
         self.crashed_thread_idx = -1
         self.version = -1
+        self.error = None
         # With possible initial component of ~ or ~user replaced by that user's home directory.
-        f = open(os.path.expanduser(self.path))
+        try:
+            f = open(self.path)
+        except IOError:
+            self.error = 'error: cannot open "%s"' % self.path
+            return
+
         self.file_lines = f.read().splitlines()
         parse_mode = PARSE_MODE_NORMAL
         thread = None
@@ -475,10 +482,12 @@
     sys.exit(0)
 
 def Symbolicate(debugger, command, result, dict):
-    SymbolicateCrashLog (command.split())
-        
+    try:
+        SymbolicateCrashLog (shlex.split(command))
+    except:
+        result.PutCString ("error: python exception %s" % sys.exc_info()[0])
+                
 def SymbolicateCrashLog(command_args):
-    print 'command_args = %s' % command_args
     usage = "usage: %prog [options] <FILE> [FILE ...]"
     description='''Symbolicate one or more darwin crash log files to provide source file and line information,
 inlined stack frames back to the concrete functions, and disassemble the location of the crash
@@ -497,9 +506,16 @@
     parser.add_option('--debug-delay', type='int', dest='debug_delay', metavar='NSEC', help='pause for NSEC seconds for debugger', default=0)
     parser.add_option('--crashed-only', action='store_true', dest='crashed_only', help='only symbolicate the crashed thread', default=False)
     loaded_addresses = False
-    (options, args) = parser.parse_args(command_args)
+    try:
+        (options, args) = parser.parse_args(command_args)
+    except:
+        return
+        
     if options.verbose:
+        print 'command_args = %s' % command_args
         print 'options', options
+        print 'args', args
+        
     if options.debug_delay > 0:
         print "Waiting %u seconds for debugger to attach..." % options.debug_delay
         time.sleep(options.debug_delay)
@@ -507,6 +523,9 @@
     if args:
         for crash_log_file in args:
             crash_log = CrashLog(crash_log_file)
+            if crash_log.error:
+                print crash_log.error
+                return
             if options.verbose:
                 crash_log.dump()
             if not crash_log.images:
