LLDB mainline
CommandObjectStats.cpp
Go to the documentation of this file.
1//===-- CommandObjectStats.cpp --------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "lldb/Core/Debugger.h"
16#include "lldb/Target/Target.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
22public:
24 : CommandObjectParsed(interpreter, "enable",
25 "Enable statistics collection", nullptr,
26 eCommandProcessMustBePaused) {}
27
28 ~CommandObjectStatsEnable() override = default;
29
30protected:
31 void DoExecute(Args &command, CommandReturnObject &result) override {
33 result.AppendError("statistics already enabled");
34 return;
35 }
36
39 }
40};
41
43public:
45 : CommandObjectParsed(interpreter, "disable",
46 "Disable statistics collection", nullptr,
47 eCommandProcessMustBePaused) {}
48
49 ~CommandObjectStatsDisable() override = default;
50
51protected:
52 void DoExecute(Args &command, CommandReturnObject &result) override {
54 result.AppendError("need to enable statistics before disabling them");
55 return;
56 }
57
60 }
61};
62
63#define LLDB_OPTIONS_statistics_dump
64#include "CommandOptions.inc"
65
67 class CommandOptions : public Options {
68 public:
70
71 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
72 ExecutionContext *execution_context) override {
74 const int short_option = m_getopt_table[option_idx].val;
75
76 switch (short_option) {
77 case 'a':
78 m_all_targets = true;
79 break;
80 case 's':
81 m_stats_options.SetSummaryOnly(true);
82 break;
83 case 'f':
84 m_stats_options.SetLoadAllDebugInfo(true);
85 break;
86 case 'r':
87 if (llvm::Expected<bool> bool_or_error =
88 OptionArgParser::ToBoolean("--targets", option_arg))
89 m_stats_options.SetIncludeTargets(*bool_or_error);
90 else
91 error = Status::FromError(bool_or_error.takeError());
92 break;
93 case 'm':
94 if (llvm::Expected<bool> bool_or_error =
95 OptionArgParser::ToBoolean("--modules", option_arg))
96 m_stats_options.SetIncludeModules(*bool_or_error);
97 else
98 error = Status::FromError(bool_or_error.takeError());
99 break;
100 case 't':
101 if (llvm::Expected<bool> bool_or_error =
102 OptionArgParser::ToBoolean("--transcript", option_arg))
103 m_stats_options.SetIncludeTranscript(*bool_or_error);
104 else
105 error = Status::FromError(bool_or_error.takeError());
106 break;
107 case 'p':
108 if (llvm::Expected<bool> bool_or_error =
109 OptionArgParser::ToBoolean("--plugins", option_arg))
110 m_stats_options.SetIncludePlugins(*bool_or_error);
111 else
112 error = Status::FromError(bool_or_error.takeError());
113 break;
114 default:
115 llvm_unreachable("Unimplemented option");
116 }
117 return error;
118 }
119
120 void OptionParsingStarting(ExecutionContext *execution_context) override {
121 m_all_targets = false;
123 }
124
125 llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
126 return llvm::ArrayRef(g_statistics_dump_options);
127 }
128
130
131 bool m_all_targets = false;
133 };
134
135public:
138 interpreter, "statistics dump", "Dump metrics in JSON format",
139 "statistics dump [<options>]", eCommandRequiresTarget) {}
140
141 ~CommandObjectStatsDump() override = default;
142
143 Options *GetOptions() override { return &m_options; }
144
145protected:
146 void DoExecute(Args &command, CommandReturnObject &result) override {
147 Target *target = nullptr;
148 if (!m_options.m_all_targets)
149 target = m_exe_ctx.GetTargetPtr();
150
151 // Check if transcript is requested but transcript saving is disabled
152 const StatisticsOptions &stats_options = m_options.GetStatisticsOptions();
153 if (stats_options.GetIncludeTranscript() &&
154 !GetDebugger().GetCommandInterpreter().GetSaveTranscript()) {
155 result.AppendWarning(
156 "transcript requested but none was saved. Enable with "
157 "'settings set interpreter.save-transcript true'");
158 }
159
161 "{0:2}",
162 DebuggerStats::ReportStatistics(GetDebugger(), target, stats_options));
164 }
165
167};
168
170 : CommandObjectMultiword(interpreter, "statistics",
171 "Print statistics about a debugging session",
172 "statistics <subcommand> [<subcommand-options>]") {
173 LoadSubCommand("enable",
174 CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
175 LoadSubCommand("disable",
177 LoadSubCommand("dump",
178 CommandObjectSP(new CommandObjectStatsDump(interpreter)));
179}
180
static llvm::raw_ostream & error(Stream &strm)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectStatsDisable() override=default
CommandObjectStatsDisable(CommandInterpreter &interpreter)
void OptionParsingStarting(ExecutionContext *execution_context) override
const StatisticsOptions & GetStatisticsOptions()
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
Options * GetOptions() override
~CommandObjectStatsDump() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectStatsDump(CommandInterpreter &interpreter)
CommandObjectStatsEnable(CommandInterpreter &interpreter)
~CommandObjectStatsEnable() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
A command line argument class.
Definition Args.h:33
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
CommandObjectStats(CommandInterpreter &interpreter)
CommandInterpreter & GetCommandInterpreter()
void void AppendError(llvm::StringRef in_string)
void SetStatus(lldb::ReturnStatus status)
void void AppendMessageWithFormatv(const char *format, Args &&...args)
void void AppendWarning(llvm::StringRef in_string)
static void SetCollectingStats(bool enable)
Definition Statistics.h:345
static bool GetCollectingStats()
Definition Statistics.h:346
static llvm::json::Value ReportStatistics(Debugger &debugger, Target *target, const lldb_private::StatisticsOptions &options)
Get metrics associated with one or all targets in a debugger in JSON format.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A command line option parsing protocol class.
Definition Options.h:58
std::vector< Option > m_getopt_table
Definition Options.h:198
An error handling class.
Definition Status.h:118
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
Definition Status.cpp:137
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
@ eReturnStatusSuccessFinishResult
static bool ToBoolean(llvm::StringRef s, bool fail_value, bool *success_ptr)