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
9#include "CommandObjectStats.h"
10#include "lldb/Core/Debugger.h"
11#include "lldb/Host/OptionParser.h"
12#include "lldb/Interpreter/CommandOptionArgumentTable.h"
13#include "lldb/Interpreter/CommandReturnObject.h"
14#include "lldb/Interpreter/OptionArgParser.h"
15#include "lldb/Target/Target.h"
16
17using namespace lldb;
18using namespace lldb_private;
19
20class CommandObjectStatsEnable : public CommandObjectParsed {
21public:
22 CommandObjectStatsEnable(CommandInterpreter &interpreter)
23 : CommandObjectParsed(interpreter, "enable",
24 "Enable statistics collection", nullptr,
25 eCommandProcessMustBePaused) {}
26
27 ~CommandObjectStatsEnable() override = default;
28
29protected:
30 void DoExecute(Args &command, CommandReturnObject &result) override {
31 if (DebuggerStats::GetCollectingStats()) {
32 result.AppendError(in_string: "statistics already enabled");
33 return;
34 }
35
36 DebuggerStats::SetCollectingStats(true);
37 result.SetStatus(eReturnStatusSuccessFinishResult);
38 }
39};
40
41class CommandObjectStatsDisable : public CommandObjectParsed {
42public:
43 CommandObjectStatsDisable(CommandInterpreter &interpreter)
44 : CommandObjectParsed(interpreter, "disable",
45 "Disable statistics collection", nullptr,
46 eCommandProcessMustBePaused) {}
47
48 ~CommandObjectStatsDisable() override = default;
49
50protected:
51 void DoExecute(Args &command, CommandReturnObject &result) override {
52 if (!DebuggerStats::GetCollectingStats()) {
53 result.AppendError(in_string: "need to enable statistics before disabling them");
54 return;
55 }
56
57 DebuggerStats::SetCollectingStats(false);
58 result.SetStatus(eReturnStatusSuccessFinishResult);
59 }
60};
61
62#define LLDB_OPTIONS_statistics_dump
63#include "CommandOptions.inc"
64
65class CommandObjectStatsDump : public CommandObjectParsed {
66 class CommandOptions : public Options {
67 public:
68 CommandOptions() { OptionParsingStarting(execution_context: nullptr); }
69
70 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
71 ExecutionContext *execution_context) override {
72 Status error;
73 const int short_option = m_getopt_table[option_idx].val;
74
75 switch (short_option) {
76 case 'a':
77 m_all_targets = true;
78 break;
79 case 's':
80 m_stats_options.SetSummaryOnly(true);
81 break;
82 case 'f':
83 m_stats_options.SetLoadAllDebugInfo(true);
84 break;
85 case 'r':
86 if (llvm::Expected<bool> bool_or_error =
87 OptionArgParser::ToBoolean("--targets", option_arg))
88 m_stats_options.SetIncludeTargets(*bool_or_error);
89 else
90 error = Status::FromError(error: bool_or_error.takeError());
91 break;
92 case 'm':
93 if (llvm::Expected<bool> bool_or_error =
94 OptionArgParser::ToBoolean("--modules", option_arg))
95 m_stats_options.SetIncludeModules(*bool_or_error);
96 else
97 error = Status::FromError(error: bool_or_error.takeError());
98 break;
99 case 't':
100 if (llvm::Expected<bool> bool_or_error =
101 OptionArgParser::ToBoolean("--transcript", option_arg))
102 m_stats_options.SetIncludeTranscript(*bool_or_error);
103 else
104 error = Status::FromError(error: bool_or_error.takeError());
105 break;
106 case 'p':
107 if (llvm::Expected<bool> bool_or_error =
108 OptionArgParser::ToBoolean("--plugins", option_arg))
109 m_stats_options.SetIncludePlugins(*bool_or_error);
110 else
111 error = Status::FromError(error: bool_or_error.takeError());
112 break;
113 default:
114 llvm_unreachable("Unimplemented option");
115 }
116 return error;
117 }
118
119 void OptionParsingStarting(ExecutionContext *execution_context) override {
120 m_all_targets = false;
121 m_stats_options = StatisticsOptions();
122 }
123
124 llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
125 return llvm::ArrayRef(g_statistics_dump_options);
126 }
127
128 const StatisticsOptions &GetStatisticsOptions() { return m_stats_options; }
129
130 bool m_all_targets = false;
131 StatisticsOptions m_stats_options = StatisticsOptions();
132 };
133
134public:
135 CommandObjectStatsDump(CommandInterpreter &interpreter)
136 : CommandObjectParsed(
137 interpreter, "statistics dump", "Dump metrics in JSON format",
138 "statistics dump [<options>]", eCommandRequiresTarget) {}
139
140 ~CommandObjectStatsDump() override = default;
141
142 Options *GetOptions() override { return &m_options; }
143
144protected:
145 void DoExecute(Args &command, CommandReturnObject &result) override {
146 Target *target = nullptr;
147 if (!m_options.m_all_targets)
148 target = m_exe_ctx.GetTargetPtr();
149
150 result.AppendMessageWithFormatv(
151 "{0:2}", DebuggerStats::ReportStatistics(
152 debugger&: GetDebugger(), target, options: m_options.GetStatisticsOptions()));
153 result.SetStatus(eReturnStatusSuccessFinishResult);
154 }
155
156 CommandOptions m_options;
157};
158
159CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
160 : CommandObjectMultiword(interpreter, "statistics",
161 "Print statistics about a debugging session",
162 "statistics <subcommand> [<subcommand-options>]") {
163 LoadSubCommand(cmd_name: "enable",
164 command_obj: CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
165 LoadSubCommand(cmd_name: "disable",
166 command_obj: CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
167 LoadSubCommand(cmd_name: "dump",
168 command_obj: CommandObjectSP(new CommandObjectStatsDump(interpreter)));
169}
170
171CommandObjectStats::~CommandObjectStats() = default;
172

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of lldb/source/Commands/CommandObjectStats.cpp