[lldb-dev] executing a c++ function from lldb python script
Niels Bogaards
niels at elephantcandy.com
Tue Jan 7 16:05:09 PST 2014
Thanks a lot, works like a charm!
Niels
> Yes, "lldb.target", "lldb.process", "lldb.thread" and "lldb.frame" are no longer set as they are global values that can be changed by code that re-enters python. We are need people to not use them anymore except when using the "script" command.
>
> So to fix this you will want to grab your frame from the debugger object that is passed in:
>
> target = debugger.GetSelectedTarget()
> process = target.GetProcess()
> thread = process.GetSelectedThread()
> frame = thread.GetSelectedFrame()
>
> Then use "frame" instead of "lldb.frame" when calling EvaluateExpression. Also instead of using magic values, you can use the enums for the 2nd param to EvaluateExpression:
>
> res = frame.EvaluateExpression(ecom, lldb.eDynamicCanRunTarget)
>
> Then be sure to set your error correctly instead of initializing it with a default constructed value:
>
> error = res.GetError()
>
> You might also want to make sure your process is stopped before trying to run the expression:
>
>
> if process.GetState() == eStateStopped:
> # Evaluate expression
> else:
> # print error
>
> On Jan 7, 2014, at 5:22 AM, Niels Bogaards <niels at elephantcandy.com> wrote:
>
>> Hi,
>>
>> I made a script for lldb last year that allowed me to plot a custom object as a curve from Xcode’s lldb prompt. Worked very well for a year, but no more. Has anything changed in the EvaluateExpression syntax? Are there linker options I need to activate in my target c++ program?
>>
>> Thanks for any help,
>>
>> Niels
>>
>>
>> Here's the script, it outputs:
>>
>> - DEBUG - res is No value
>> - DEBUG - fname is No value
>> - DEBUG - error is error: <NULL>
>>
>>
>> import lldb
>> import commands
>> import optparse
>> import shlex
>> import logging
>>
>> def plot(debugger, command, result, dict):
>> logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
>> command_args = shlex.split(command)
>> usage = "usage: %prog objectName "
>> description=‘''plot'''
>> parser = optparse.OptionParser(description=description, prog='plot',usage=usage)
>>
>> try:
>> (options, args) = parser.parse_args(command_args)
>> except:
>> print '"plot" exception'
>> return
>> la = len(args)
>> print 'len args = %d' % la
>> if len(args) == 1:
>> ecom = “MyNamespace::MyClass::MyStaticPlotFunction(%s)" % args[0]
>> res = lldb.frame.EvaluateExpression(ecom, 1)
>> fname = lldb.frame.EvaluateExpression("MyNamespace::MyClass::GetStaticPlotFileName()")
>> error = lldb.SBError()
>> logging.debug("res is %s", res);
>> logging.debug("fname is %s", fname);
>> logging.debug("error is %s", error);
>>
>> if __name__ == '__main__':
>> # This script is being run from the command line, create a debugger in case we are
>> # going to use any debugger functions in our function.
>> lldb.debugger = lldb.SBDebugger.Create()
>> plot (sys.argv)
>>
>> def __lldb_init_module (debugger, dict):
>> # This initializer is being run from LLDB in the embedded command interpreter
>> # Add any commands contained in this module to LLDB
>> debugger.HandleCommand('command script add -f plot.plot plot')
>> print '"plot" command installed, type "plot --help" for detailed help'
>>
>> _______________________________________________
>> 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