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

Jim Ingham jingham at apple.com
Thu Mar 31 18:45:57 PDT 2011


Not sure why the CLI runner is not working, I generally use the SB API's when doing scripting as that is more powerful.  There are plenty of examples in the tests directory in the sources that do this, however.

The following will just run any program you pass it over and over, and catch if it stops, and print a backtrace.  Note I cheesed out and did use the CLI to get the backtrace but that's 'cause it is just a toy...

-------------- next part --------------
A non-text attachment was scrubbed...
Name: run-alot.py
Type: text/x-python-script
Size: 2212 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20110331/9cf9ab0f/attachment.bin>
-------------- next part --------------


This one works for me.  See if it works for you...

Jim

On Mar 31, 2011, at 6:15 PM, William Knop wrote:

> 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
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev



More information about the lldb-dev mailing list