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

William Knop william.knop.nospam at gmail.com
Sat Apr 2 06:05:16 PDT 2011


Hi again,
I've gotten quite far with this script (attached), however I cannot
figure out if there is a way invoke the lldb interpreter (i.e. the
"(lldb)" prompt). It would seem that one could somehow activate the
debugger's EditLineInputReader, perhaps via PushInputReader.
Unfortunately, EditLineInputReader doesn't appear to be exposed. At
this point, I may write a small hackish python function that loops,
sending input via HandleCommand. If there's another way where I don't
have to hack out an interpreter loop, I'd be grateful to hear of it.

Will

On Fri, Apr 1, 2011 at 9:41 PM, William Knop
<william.knop.nospam at gmail.com> wrote:
> Brilliant! Between this example and Jim's, I think I'll be able to put
> something nice together.
>
> Thank you both,
> Will
>
> On Fri, Apr 1, 2011 at 9:26 PM, Johnny Chen <johnny.chen at apple.com> wrote:
>> Hi William,
>> Wonder if:
>> URL: http://llvm.org/viewvc/llvm-project?rev=128755&view=rev
>> Log:
>> Add a Python script which launches a program from within lldb and loop until
>> the
>> process stops for some reason.  main.c (compiled into a.out) is used as an
>> example in
>> the README-run-until-faulted file.
>>
>> Added:
>>    lldb/trunk/utils/test/README-run-until-faulted
>>    lldb/trunk/utils/test/main.c
>>    lldb/trunk/utils/test/run-until-faulted.py   (with props)
>>
>> is a good enough start for your need?
>> Thanks.
>> 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