Author: jingham
Date: Fri Aug  5 18:35:26 2016
New Revision: 277890

URL: http://llvm.org/viewvc/llvm-project?rev=277890&view=rev
Log:
Mention the scripted thread plans in the python reference.

Modified:
    lldb/trunk/www/python-reference.html

Modified: lldb/trunk/www/python-reference.html
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/www/python-reference.html?rev=277890&r1=277889&r2=277890&view=diff
==============================================================================
--- lldb/trunk/www/python-reference.html (original)
+++ lldb/trunk/www/python-reference.html Fri Aug  5 18:35:26 2016
@@ -314,6 +314,118 @@ Enter your Python command(s). Type 'DONE
             To remove the breakpoint command:
             <p><code>(lldb) <strong>breakpoint command delete 1</strong></code>
             </div>
+
+       </div>
+               <div class="post">
+                       <h1 class ="postheader">Using the Python API's to 
create custom stepping logic</h1>
+                       <div class="postcontent">
+
+                <p>A slightly esoteric use of the Python API's is to construct 
custom stepping types.  LLDB's stepping is
+                   driven by a stack of "thread plans" and a fairly simple 
state machine that runs the plans.  You can create
+                   a Python class that works as a thread plan, and responds to 
the requests the state machine makes to run
+                   its operations. </p>
+                <p>There is a longer discussion of scripted thread plans and 
the state machine, and several interesting examples
+                   of their use in:</p>
+        <a 
href="http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/scripted_step.py";>scripted_step.py</a>
+
+                <p> And for a MUCH fuller discussion of the whole state 
machine, see:</p>
+
+        <a 
href="http://llvm.org/svn/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlan.h";>ThreadPlan.h</a>
+             
+                <p>If you are reading those comments it is useful to know that 
scripted thread plans are set to be
+                  "MasterPlans", and not "OkayToDiscard".
+
+                <p>To implement a scripted step, you define a python class 
that has the following methods:</p>
+</tt></pre></code>
+                    <p><table class="stats" width="620" cellspacing="0">
+                    <tr>
+                        <td class="hed" width="10%">Name</td>
+                        <td class="hed" width="10%">Arguments</td>
+                        <td class="hed" width="80%">Description</td>
+                    </tr>
+
+
+                    <tr>
+                        <td class="content">
+                            <b>__init__</b>
+                        </td>
+                        <td class="content">
+                            <b>thread_plan: lldb.SBThreadPlan</b>
+                        </td>
+                        <td class="content">
+                            This is the underlying SBThreadPlan that is pushed 
onto the plan stack.  
+                            You will want to store this away in an ivar.  
Also, if you are going to
+                            use one of the canned thread plans, you can queue 
it at this point.
+                        </td>
+                    </tr>
+
+                    <tr>
+                        <td class="content">
+                            <b>explains_stop</b>
+                        </td>
+                        <td class="content">
+                            <b>event: lldb.SBEvent</b>
+                        </td>
+                        <td class="content">
+                            Return True if this stop is part of your thread 
plans logic, false otherwise.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="content">
+                            <b>is_stale</b>
+                        </td>
+                        <td class="content">
+                            <b>None</b>
+                        </td>
+                        <td class="content">
+                            If your plan is no longer relevant (for instance, 
you were
+                            stepping in a particular stack frame, but some 
other operation
+                            pushed that frame off the stack) return True and 
your plan will
+                            get popped.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="content">
+                            <b>should_step</b>
+                        </td>
+                        <td class="content">
+                            <b>None</b>
+                        </td>
+                        <td class="content">
+                            Return True if you want lldb to instruction step 
one instruction,
+                            or False to continue till the next breakpoint is 
hit.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="content">
+                            <b>should_stop</b>
+                        </td>
+                        <td class="content">
+                            <b>event: lldb.SBEvent</b>
+                        </td>
+                        <td class="content">
+                          If your plan wants to stop and return control to the 
user at this point, return True.
+                          If your plan is done at this point, call 
SetPlanComplete on your
+                          thread plan instance.
+                          Also, do any work you need here to set up the next 
stage of stepping.
+                        </td>
+                    </tr>
+                    </table>
+                   
+                    <p>To use this class to implement a step, use the 
command:</p>
+
+<code><pre><tt>(lldb) <strong>thread step-scripted -C 
MyModule.MyStepPlanClass</strong>
+</tt></pre></code>
+                   <p>Or use the SBThread.StepUsingScriptedThreadPlan API.  
The SBThreadPlan passed into
+                     your __init__ function can also push several common plans 
(step in/out/over and run-to-address)
+                     in front of itself on the stack, which can be used to 
compose more complex stepping operations.
+                     When you use subsidiary plans your explains_stop and 
should_stop methods won't get called until
+                     the subsidiary plan is done, or the process stops for an 
event the subsidiary plan doesn't
+                     explain.  For instance, step over plans don't explain a 
breakpoint hit while performing the
+                     step-over.</p>
+
+            </div>
+
         </div>
                <div class="post">
                        <h1 class ="postheader">Create a new LLDB command using 
a python function</h1>


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to