> On Mar 20, 2015, at 1:06 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> Hi Greg, 
> 
> I found a problem with my initialization refactor, so I want to get your 
> advice before I commit it.  The issue is related to the fact that 
> modify-python-lldb.py inserts some code at the end to automatically call 
> SBDebugger.Initialize() the first time anyone runs "import lldb".
> 
> When using lldb from python.  When using lldb from python, this means the 
> user doesn't have to call SBDebugger.Initialize() because "import lldb" will 
> do it automatically.  When using lldb the executable, we call 
> SBDebugger::Initialize() explicitly, which results in a call to this line in 
> ScriptInterpreterPython:
>     
>     int old_count = Debugger::TestDebuggerRefCount ();
> 
>     PyRun_SimpleString ("sys.dont_write_bytecode = 1; import 
> lldb.embedded_interpreter; from lldb.embedded_interpreter import 
> run_python_interpreter; from lldb.embedded_interpreter import run_one_line");
> 
>     int new_count = Debugger::TestDebuggerRefCount ();
>     
>     if (new_count > old_count)
>         Debugger::Terminate ();
> 
> Since this is the first time lldb is imported, it results in a call to 
> SBDebugger::Initialize() again.  This recursive call doesn't do anything 
> because it sees that g_initialized has been set to true already.  But when it 
> returns control back to the line after the PyRun_SimpleString(), it tests the 
> new ref count against the old ref count and calls Debugger::Terminate.  But, 
> the ref count was previously 1, so this results in the debugger refcount 
> being 0.  In practice it turns out this doesn't matter, because all 
> Debugger::Terminate() does is clear an already clear debugger list.  And 
> actually I can fix it by changing SystemLifetimeManager::AddRef() to put the 
> call to Debugger::Initialize() before the call to m_initializer->Initialize().
> 
> But all of this is very fragile and confusing.  I have an idea for fixing 
> this a "better" way, but I would like your opinion.
> 
> If we remove the call to SBDebugger.Initialize() from __init__.py (by 
> changing modify-python-lldb.py to not insert these lines) the problems 
> disappear.  Now, when we write PyRun_SimpleString("import lldb") we don't get 
> a recursive call to SBDebugger::Initialize().  We would need to update the 
> test suite to explicitly call this.
> 
> I think this makes for a more clear usage pattern.  implicitly calling 
> SBDebugger.Initialize() just seems like a bad idea.  By making this change we 
> would be able to remove all of the debugger ref count testing and 
> conditionally calling Debugger::Terminate. 
> 
> Thoughts?

My main concern is "things should just work". Python expects functions to be 
ready to be called after importing so I would like to not require people to 
call SBDebugger::Initialize() first after a "import lldb". What ever we have to 
do to make this work, we should do that.

I don't know of _any_ other python module that requires you to call some 
function after importing the module, so it makes sense from a C++ API 
perspective, but not for python.

So I would vote to do what you need to do to make the following two things 
happen:
- from python when it loads LLDB "import lldb" should be enough
- in the embedded interpreter we should obviously not have to call it



_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to