blob: c50c84f91db95219b42f30546c1f16f3baadf2a2 [file] [log] [blame]
// Copyright 2019 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_libs.h"
#include <algorithm>
#include "src/developer/debug/zxdb/client/process.h"
#include "src/developer/debug/zxdb/client/target.h"
#include "src/developer/debug/zxdb/common/string_util.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_table.h"
#include "src/developer/debug/zxdb/console/output_buffer.h"
#include "src/developer/debug/zxdb/console/verbs.h"
#include "src/lib/fxl/strings/string_printf.h"
namespace zxdb {
namespace {
const char kLibsShortHelp[] = "libs: Show loaded libraries for a process.";
const char kLibsHelp[] =
R"(libs
Shows the loaded library information for the given process.
Examples
libs
process 2 libs
)";
// Completion callback for DoLibs().
void OnLibsComplete(const Err& err, std::vector<debug_ipc::Module> modules) {
Console* console = Console::get();
if (err.has_error()) {
console->Output(err);
return;
}
// Sort by load address.
std::sort(modules.begin(), modules.end(),
[](const debug_ipc::Module& a, const debug_ipc::Module& b) { return a.base < b.base; });
std::vector<std::vector<std::string>> rows;
for (const auto& module : modules) {
rows.push_back(std::vector<std::string>{to_hex_string(module.base), module.name});
}
OutputBuffer out;
FormatTable({ColSpec(Align::kRight, 0, "Load address", 2), ColSpec(Align::kLeft, 0, "Name", 1)},
rows, &out);
console->Output(out);
}
Err RunVerbLibs(ConsoleContext* context, const Command& cmd) {
// Only a process can be specified.
if (Err err = cmd.ValidateNouns({Noun::kProcess}); err.has_error())
return err;
if (!cmd.args().empty())
return Err(ErrType::kInput, "\"libs\" takes no parameters.");
if (Err err = AssertRunningTarget(context, "libs", cmd.target()); err.has_error())
return err;
cmd.target()->GetProcess()->GetModules(&OnLibsComplete);
return Err();
}
} // namespace
VerbRecord GetLibsVerbRecord() {
return VerbRecord(&RunVerbLibs, {"libs"}, kLibsShortHelp, kLibsHelp, CommandGroup::kQuery);
}
} // namespace zxdb