Skip to content

Add docs describing how the thread plan stack affects stepping #110167

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 27, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions lldb/docs/use/tutorial.rst
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,43 @@ This command will run the thread in the current frame until it reaches line 100
in this frame or stops if it leaves the current frame. This is a pretty close
equivalent to GDB's ``until`` command.

One other useful thing to note about the lldb stepping commands is that they
are implemented as a stack of interruptible operations. Until the operation -
e.g. step to the next line - is completed, it will remain on the
stack. If the step over is interrupted and control returned to you,
any new stepping commands you issue won't replace the step-over, but instead
their operations will be pushed onto the stack after the original step over.
Then each of them will be retired as they are completed, finally returning to the
original step over operation.

Suppose, for instance, you ``step-over`` a source line with a function call.
If there is a breakpoint in that function, hitting the breakpoint will interrupt
the step over. At that point, you will likely want to examine the state at
the breakpoint, maybe stepping around in that frame, or stepping into other
functions, running some expressions, etc.

Because the original step-over has remained on the stack, when you've finished
your examinations, a simple ``continue`` will resume the original ``step-over``
operation, and you will arrive at the end of your starting source line in the
original frame.

This saves you from having to keep track of your original intention, and manually
issuing the requisite number of ``step-out`` commands to get back to the frame
you were stepping over. The stack maintains that information for you.

Hand-called functions using the ``expr`` command are also implemented by
operations on this same stack. So if you are calling some code with the ``expr`` command,
and hit a breakpoint during the evaluation of that code, you can examine
the state where you stopped, and when you're satisfied, issue a
``continue`` to finish the expression evaluation operation and print the function
result.

You can examine the state of the operations stack using the ``thread plan list``
command, and if, for instance, you decide you don't actually want that outermost
next to continue running, you can remove it with the ``thread plan discard``
command. If you are interested in following this process in more detail, the
``lldb step`` logging channel is useful source of information.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Perhaps mention the thread plan logging channel? thread plan list and thread plan discard are obviously more accessible but the logging channel shows the changes to the stack as they occur.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean the step channel? There is a lot of detailed output there, I'm not sure we want the average tutorial.rst reader to be pointed that way...

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a fire-hose for sure, but OTOH, it's the only way to watch the machinery happen. It will be clear right away when you turn it on whether that info is for you or not...

A process, by default, will share the LLDB terminal with the inferior process.
When in this mode, much like when debugging with GDB, when the process is
running anything you type will go to the ``STDIN`` of the inferior process. To
Expand Down
Loading