Index: lldb/trunk/include/lldb/Interpreter/PythonDataObjects.h =================================================================== --- lldb/trunk/include/lldb/Interpreter/PythonDataObjects.h +++ lldb/trunk/include/lldb/Interpreter/PythonDataObjects.h @@ -62,9 +62,11 @@ { if (py_obj != m_py_obj) { - Py_XDECREF(m_py_obj); + if (Py_IsInitialized()) + Py_XDECREF(m_py_obj); m_py_obj = py_obj; - Py_XINCREF(m_py_obj); + if (Py_IsInitialized()) + Py_XINCREF(m_py_obj); } return true; } Index: lldb/trunk/include/lldb/Interpreter/ScriptInterpreterPython.h =================================================================== --- lldb/trunk/include/lldb/Interpreter/ScriptInterpreterPython.h +++ lldb/trunk/include/lldb/Interpreter/ScriptInterpreterPython.h @@ -357,7 +357,8 @@ virtual ~ScriptInterpreterPythonObject() { - Py_XDECREF(m_object); + if (Py_IsInitialized()) + Py_XDECREF(m_object); m_object = NULL; } private: Index: lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp =================================================================== --- lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp +++ lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp @@ -1806,7 +1806,11 @@ Locker locker(this, ScriptInterpreterPython::Locker::AcquireLock, ScriptInterpreterPython::Locker::FreeAcquiredLock); - PyRun_SimpleString("lldb.debugger = None; lldb.target = None; lldb.process = None; lldb.thread = None; lldb.frame = None"); + + // This may be called as part of Py_Finalize. In that case the modules are destroyed in random + // order and we can't guarantee that we can access these. + if (Py_IsInitialized()) + PyRun_SimpleString("lldb.debugger = None; lldb.target = None; lldb.process = None; lldb.thread = None; lldb.frame = None"); } bool Index: lldb/trunk/test/dotest.py =================================================================== --- lldb/trunk/test/dotest.py +++ lldb/trunk/test/dotest.py @@ -20,7 +20,6 @@ for available options. """ -import atexit import commands import os import errno @@ -419,7 +418,6 @@ cmd = "xcrun clang %s -o %s -framework Python -Xlinker -dylib -iframework /System/Library/Frameworks/ -Xlinker -F /System/Library/Frameworks/" % (dylib_src,dylib_dst) if subprocess.call(cmd,shell=True) == 0 and os.path.exists(dylib_dst): setCrashInfoHook = setCrashInfoHook_Mac - atexit.register(deleteCrashInfoDylib,dylib_dst) else: pass @@ -1201,6 +1199,11 @@ print "Exiting..." sys.exit(0) +def exitTestSuite(exitCode = None): + lldb.SBDebugger.Terminate() + if exitCode: + sys.exit(exitCode) + # On MacOS X, check to make sure that domain for com.apple.DebugSymbols defaults # does not exist before proceeding to running the test suite. if sys.platform.startswith("darwin"): @@ -1232,11 +1235,7 @@ # For the time being, let's bracket the test runner within the # lldb.SBDebugger.Initialize()/Terminate() pair. -import lldb, atexit -# Update: the act of importing lldb now executes lldb.SBDebugger.Initialize(), -# there's no need to call it a second time. -#lldb.SBDebugger.Initialize() -atexit.register(lambda: lldb.SBDebugger.Terminate()) +import lldb # Create a singleton SBDebugger in the lldb namespace. lldb.DBG = lldb.SBDebugger.Create() @@ -1246,7 +1245,7 @@ lldb.remote_platform = lldb.SBPlatform(lldb_platform_name) if not lldb.remote_platform.IsValid(): print "error: unable to create the LLDB platform named '%s'." % (lldb_platform_name) - sys.exit(1) + exitTestSuite(1) if lldb_platform_url: # We must connect to a remote platform if a LLDB platform URL was specified print "Connecting to remote platform '%s' at '%s'..." % (lldb_platform_name, lldb_platform_url) @@ -1256,7 +1255,7 @@ print "Connected." else: print "error: failed to connect to remote platform using URL '%s': %s" % (lldb_platform_url, err) - sys.exit(1) + exitTestSuite(1) if lldb_platform_working_dir: print "Setting remote platform working directory to '%s'..." % (lldb_platform_working_dir) @@ -1397,7 +1396,7 @@ if not compilers or len(compilers) == 0: print "No eligible compiler found, exiting." - sys.exit(1) + exitTestSuite(1) if isinstance(compilers, list) and len(compilers) >= 1: iterCompilers = True @@ -1738,4 +1737,4 @@ subprocess.Popen(["/bin/sh", "-c", "kill %s; exit 0" % (os.getpid())]) # Exiting. -sys.exit(failed) +exitTestSuite() \ No newline at end of file