I found that if I am using synchronous mode, some times there are no debug events generated during launch. For example, for the code below, LLDBListenerThread will receive no debug events.
Is this expected? What is the rule of debug events in synchronous mode?
debugger = lldb.SBDebugger.Create()
target = debugger.CreateTargetWithFileAndArch(executable_path, lldb.LLDB_ARCH_DEFAULT)
listener = lldb.SBListener(‘Event Listener’)
error = lldb.SBError()
process = target.Launch (listener,
None, # argv
None, # envp
None, # stdin_path
None, # stdout_path
None, # stderr_path
None, # working directory
0, # launch flags
False, # Stop at entry
error) # error
print ‘Launch result: %s’ % str(error)
event_thread = LLDBListenerThread(debugger)
I am not sure what are the "official" rules, but the general idea is
that you need not concern yourself too much with events when you are
in synchronous mode. In synchronous mode, you can be sure that by the
time target.Launch() returns, the process will be stopped (or dead, or
something else, you can check process.GetState() to find that out). No
need to play around with listeners...
In synchronous mode, you should never see events. The part of lldb that is making the command synchronous is using those events to make the command wait till the action it initiated completes before it returns. If it is letting process control events leak out, then that is a bug.
If you are running in async mode (and haven't set stop-at-entry in the launch options), then you won't see an event till the process stops for some other reason (e.g. hitting a breakpoint.) If launch returns with no error, then your process got launched, and you should just wait for it to stop.
Jim, thanks for the confirmation. It seems to me that there are many
quirks of LLDB API that you have to be aware of before you can
automate it correctly. Are these quirks documented somewhere that I
missed? I have looked at examples/tests folders of LLDB and python API
pages, both do not have enough depths as the discussions here.