| // 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_sym_near.h" |
| |
| #include "src/developer/debug/zxdb/client/process.h" |
| #include "src/developer/debug/zxdb/client/target.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/format_location.h" |
| #include "src/developer/debug/zxdb/console/output_buffer.h" |
| #include "src/developer/debug/zxdb/console/verbs.h" |
| #include "src/developer/debug/zxdb/symbols/process_symbols.h" |
| |
| namespace zxdb { |
| |
| namespace { |
| |
| const char kSymNearShortHelp[] = "sym-near / sn: Print symbol for an address."; |
| const char kSymNearHelp[] = |
| R"(sym-near <address-expression> |
| |
| Alias: "sn" |
| |
| Finds the symbol nearest to the given address. This command is useful for |
| finding what a pointer or a code location refers to. |
| |
| The address can be an explicit number or any expression ("help print") that |
| evaluates to a memory address. |
| |
| Example |
| |
| sym-near 0x12345670 |
| process 2 sym-near &x |
| )"; |
| |
| Err RunVerbSymNear(ConsoleContext* context, const Command& cmd) { |
| if (Err err = cmd.ValidateNouns({Noun::kProcess}); err.has_error()) |
| return err; |
| if (Err err = AssertRunningTarget(context, "sym-near", cmd.target()); err.has_error()) |
| return err; |
| |
| return EvalCommandAddressExpression( |
| cmd, "sym-near", GetEvalContextForCommand(cmd), |
| [weak_process = cmd.target()->GetProcess()->GetWeakPtr()](const Err& err, uint64_t address, |
| std::optional<uint64_t> size) { |
| Console* console = Console::get(); |
| if (err.has_error()) { |
| console->Output(err); // Evaluation error. |
| return; |
| } |
| if (!weak_process) { |
| // Process has been destroyed during evaluation. Normally a message will be printed when |
| // that happens so we can skip reporting the error. |
| return; |
| } |
| |
| auto locations = weak_process->GetSymbols()->ResolveInputLocation(InputLocation(address)); |
| FX_DCHECK(locations.size() == 1u); |
| |
| FormatLocationOptions opts(weak_process->GetTarget()); |
| opts.always_show_addresses = true; |
| opts.show_file_line = true; |
| |
| console->Output(FormatLocation(locations[0], opts)); |
| }); |
| } |
| |
| } // namespace |
| |
| VerbRecord GetSymNearVerbRecord() { |
| VerbRecord sym_near(&RunVerbSymNear, {"sym-near", "sn"}, kSymNearShortHelp, kSymNearHelp, |
| CommandGroup::kSymbol); |
| sym_near.param_type = VerbRecord::kOneParam; |
| return sym_near; |
| } |
| |
| } // namespace zxdb |