| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/debug/zxdb/console/commands/verb_jump.h" |
| |
| #include "src/developer/debug/zxdb/client/thread.h" |
| #include "src/developer/debug/zxdb/console/command.h" |
| #include "src/developer/debug/zxdb/console/command_utils.h" |
| #include "src/developer/debug/zxdb/console/console.h" |
| #include "src/developer/debug/zxdb/console/input_location_parser.h" |
| #include "src/developer/debug/zxdb/console/output_buffer.h" |
| #include "src/developer/debug/zxdb/console/verbs.h" |
| |
| namespace zxdb { |
| |
| namespace { |
| |
| const char kJumpShortHelp[] = "jump / jmp: Set the instruction pointer to a different address."; |
| const char kJumpHelp[] = |
| R"(jump <location> |
| |
| Alias: "jmp" |
| |
| Sets the instruction pointer of the thread to the given address. It does not |
| continue execution. You can "step" or "continue" from the new location. |
| |
| You are responsible for what this means semantically since one can't |
| generally change the instruction flow and expect things to work. |
| |
| Location arguments |
| |
| )" LOCATION_ARG_HELP("jump"); |
| |
| Err RunVerbJump(ConsoleContext* context, const Command& cmd) { |
| if (Err err = AssertStoppedThreadWithFrameCommand(context, cmd, "jump"); err.has_error()) |
| return err; |
| |
| if (cmd.args().size() != 1) |
| return Err("The 'jump' command requires one argument for the location."); |
| |
| Location location; |
| if (Err err = ResolveUniqueInputLocation(cmd.frame(), cmd.args()[0], true, &location); |
| err.has_error()) |
| return err; |
| |
| cmd.thread()->JumpTo(location.address(), [thread = cmd.thread()->GetWeakPtr()](const Err& err) { |
| Console* console = Console::get(); |
| if (err.has_error()) { |
| console->Output(err); |
| } else if (thread) { |
| // Reset the current stack frame to the top to reflect the location the user has just jumped |
| // to. |
| console->context().SetActiveFrameIdForThread(thread.get(), 0); |
| |
| // Tell the user where they are. |
| console->context().OutputThreadContext(thread.get(), StopInfo()); |
| } |
| }); |
| |
| return Err(); |
| } |
| |
| } // namespace |
| |
| VerbRecord GetJumpVerbRecord() { |
| return VerbRecord(&RunVerbJump, &CompleteInputLocation, {"jump", "jmp"}, kJumpShortHelp, |
| kJumpHelp, CommandGroup::kStep); |
| } |
| |
| } // namespace zxdb |