mirror of
https://github.com/intel/llvm.git
synced 2026-01-13 19:08:21 +08:00
This patch is a smaller version of a previous patch https://reviews.llvm.org/D110804. This patch modifies the output of "statistics dump" to be able to get stats from the current target. It adds 3 new stats as well. The output of "statistics dump" is now emitted as JSON so that it can be used to track performance and statistics and the output could be used to populate a database that tracks performance. Sample output looks like: (lldb) statistics dump { "expressionEvaluation": { "failures": 0, "successes": 0 }, "firstStopTime": 0.34164492800000001, "frameVariable": { "failures": 0, "successes": 0 }, "launchOrAttachTime": 0.31969605400000001, "targetCreateTime": 0.0040863039999999998 } The top level keys are: "expressionEvaluation" which replaces the previous stats that were emitted as plain text. This dictionary contains the success and fail counts. "frameVariable" which replaces the previous stats for "frame variable" that were emitted as plain text. This dictionary contains the success and fail counts. "targetCreateTime" contains the number of seconds it took to create the target and load dependent libraries (if they were enabled) and also will contain symbol preloading times if that setting is enabled. "launchOrAttachTime" is the time it takes from when the launch/attach is initiated to when the first private stop occurs. "firstStopTime" is the time in seconds that it takes to stop at the first stop that is presented to the user via the LLDB interface. This value will only have meaning if you set a known breakpoint or stop location in your code that you want to measure as a performance test. This diff is also meant as a place to discuess what we want out of the "statistics dump" command before adding more funcionality. It is also meant to clean up the previous code that was storting statistics in a vector of numbers within the lldb_private::Target class. Differential Revision: https://reviews.llvm.org/D111686
135 lines
4.4 KiB
C++
135 lines
4.4 KiB
C++
//===-- CommandObjectStats.cpp --------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "CommandObjectStats.h"
|
|
#include "lldb/Core/Debugger.h"
|
|
#include "lldb/Host/OptionParser.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Target/Target.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
class CommandObjectStatsEnable : public CommandObjectParsed {
|
|
public:
|
|
CommandObjectStatsEnable(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(interpreter, "enable",
|
|
"Enable statistics collection", nullptr,
|
|
eCommandProcessMustBePaused) {}
|
|
|
|
~CommandObjectStatsEnable() override = default;
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
if (DebuggerStats::GetCollectingStats()) {
|
|
result.AppendError("statistics already enabled");
|
|
return false;
|
|
}
|
|
|
|
DebuggerStats::SetCollectingStats(true);
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class CommandObjectStatsDisable : public CommandObjectParsed {
|
|
public:
|
|
CommandObjectStatsDisable(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(interpreter, "disable",
|
|
"Disable statistics collection", nullptr,
|
|
eCommandProcessMustBePaused) {}
|
|
|
|
~CommandObjectStatsDisable() override = default;
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
if (!DebuggerStats::GetCollectingStats()) {
|
|
result.AppendError("need to enable statistics before disabling them");
|
|
return false;
|
|
}
|
|
|
|
DebuggerStats::SetCollectingStats(false);
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
#define LLDB_OPTIONS_statistics_dump
|
|
#include "CommandOptions.inc"
|
|
|
|
class CommandObjectStatsDump : public CommandObjectParsed {
|
|
class CommandOptions : public Options {
|
|
public:
|
|
CommandOptions() : Options() { OptionParsingStarting(nullptr); }
|
|
|
|
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
|
|
ExecutionContext *execution_context) override {
|
|
Status error;
|
|
const int short_option = m_getopt_table[option_idx].val;
|
|
|
|
switch (short_option) {
|
|
case 'a':
|
|
m_all_targets = true;
|
|
break;
|
|
default:
|
|
llvm_unreachable("Unimplemented option");
|
|
}
|
|
return error;
|
|
}
|
|
|
|
void OptionParsingStarting(ExecutionContext *execution_context) override {
|
|
m_all_targets = false;
|
|
}
|
|
|
|
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
|
|
return llvm::makeArrayRef(g_statistics_dump_options);
|
|
}
|
|
|
|
bool m_all_targets = false;
|
|
};
|
|
|
|
public:
|
|
CommandObjectStatsDump(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(
|
|
interpreter, "statistics dump", "Dump metrics in JSON format",
|
|
"statistics dump [<options>]", eCommandRequiresTarget) {}
|
|
|
|
~CommandObjectStatsDump() override = default;
|
|
|
|
Options *GetOptions() override { return &m_options; }
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
if (m_options.m_all_targets) {
|
|
result.AppendMessageWithFormatv(
|
|
"{0:2}", DebuggerStats::ReportStatistics(GetDebugger()));
|
|
} else {
|
|
Target &target = m_exe_ctx.GetTargetRef();
|
|
result.AppendMessageWithFormatv("{0:2}", target.ReportStatistics());
|
|
}
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
|
|
CommandOptions m_options;
|
|
};
|
|
|
|
CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
|
|
: CommandObjectMultiword(interpreter, "statistics",
|
|
"Print statistics about a debugging session",
|
|
"statistics <subcommand> [<subcommand-options>]") {
|
|
LoadSubCommand("enable",
|
|
CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
|
|
LoadSubCommand("disable",
|
|
CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
|
|
LoadSubCommand("dump",
|
|
CommandObjectSP(new CommandObjectStatsDump(interpreter)));
|
|
}
|
|
|
|
CommandObjectStats::~CommandObjectStats() = default;
|