[lldb-dev] Using LLDB to catch a spurious segfault: scripting, etc.

William Knop william.knop.nospam at gmail.com
Thu Mar 31 18:15:51 PDT 2011


Hello all,

I am attempting to use lldb to debug a segfault in my program that
happens sporadically. For instance, running `for ((i=0;i<1000;i++)) {
./myprogram; };` at a shell prompt may show one. It seems there is no
way to set lldb to run automatically and exit upon success from the
CLI, so I've been exploring lldb's python scripting.

The goal of the script is to loop, launching the process until
completion or error; if there's an error, I need the script to dump me
back into the lldb interpreter to investigate the bug. Here's what
I've come up with so far:

> import time
> dbg = lldb.SBDebugger.FindDebuggerWithID(lldb.debugger_unique_id)
> ci = dbg.GetCommandInterpreter()
> res = lldb.SBCommandReturnObject()
> dbg.SetAsync(False)
> for i in range(1, 1000):
>   ci.HandleCommand("process launch", res)
>   while (not res.Succeeded()) : time.sleep(0.1)
>   res.Clear()

Unfortunately, however, it seems the command does not run to
completion, no matter how long I wait. Then when I call
`HandleCommand` a second time, lldb deadlocks. I intended to
eventually check `res.GetError()` or `res.GetStatus()` and call
`quit()` when the error appeared, but I haven't made it that far. I
also initially explored calling `dbg.GetTargetAtIndex(0).Launch()`
rather than `HandleCommand`, but I wasn't entirely sure how to go
about it. Any help would be much appreciated!

Will



More information about the lldb-dev mailing list