Hi again, 

It seems that, if I use the debugger's listener (like Driver.cpp does), it 
works:

If I change the test to do this:
        listener = self.dbg.GetListener()
instead of:
listener = lldb.SBListener("test-listener")


Everything works (after we take into account the additional events related to 
the program's STDOUT). But shouldn't my first version work? I setup the 
SBListener before doing anything that will use it, and the events should be 
propagated to every listener that is hanging to the Process broadcaster. Or am 
I missing something?

Thanks,

  Filipe


On Tuesday, May 8, 2012 at 12:02 PM, Filipe Cabecinhas wrote:

> Hi all! 
> 
> I'm having some weird problems with asynchronous API usage. I will address it 
> in this email as if it was a bug, but it may be wrong API usage from my part.
> 
> The main problem is the run lock being write locked when the process is 
> stopped (and I got a state changed event).
> What happens is:
> 
> Create a target (a simple 'hello world'-like program) and set a breakpoint
> Set Async mode.
> 
> Set up an SBListener that will listen (on the SBDebugger) for 
> lldb.SBProcess.eBroadcastBitStateChanged, from event class 
> lldb.SBProcess.GetBroadcasterClassName().
> Call SBTarget::LaunchSimple(None, None, os.getcwd())
> Wait for an event
> The process is now in a stopped state (checked using GetStateFromEvent() == 
> eStateStopped)
> Try to get the stopped thread. There isn't any (the only thread has 
> eStopReasonInvalid).
> 
> Why does this happen?
> 
> SBTarget::Launch() will start the process (the run_lock gets created 
> write-locked, the Process' public state will be eStateRunning) and wait for 
> it to stop (when it stops, the Event's DoOnRemoval will change the public 
> state (to eStateStopped) of the Process and call WriteUnlock()).
> After the process stopped on entry, we want to continue until we hit our 
> breakpoint. SBTarget::Launch calls Process::Resume, which will call 
> WriteTryLock (succeeding) and call into Process::PrivateResume()
> 
> The lock will not be unlocked again.
> The Process' private state will toggle between the stopped and running states 
> several times, before stopping at the breakpoint. When it stops at the 
> breakpoint, it will set the Process' public state to eStateStopped. But the 
> public state was already eStateStopped, so we won't call WriteUnlock on 
> Process.cpp:1310.
> 
> Any clues on where to look for? I've started debugging it but maybe Greg will 
> know best where to look and how to fix this.
> 
> Attached is a test that show the problem (main.cpp is from 
> python_api/process).
> 
> Thanks, 
> 
> Filipe 
> 
> 
> Attachments: 
> - main.cpp
> 
> - Makefile
> 
> - TestProcessRWLock.py
> 



_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to