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/Interpreter/CommandReturnObject.h"
11 #include "lldb/Target/Target.h"
12
13 using namespace lldb;
14 using namespace lldb_private;
15
16 class CommandObjectStatsEnable : public CommandObjectParsed {
17 public:
CommandObjectStatsEnable(CommandInterpreter & interpreter)18 CommandObjectStatsEnable(CommandInterpreter &interpreter)
19 : CommandObjectParsed(interpreter, "enable",
20 "Enable statistics collection", nullptr,
21 eCommandProcessMustBePaused) {}
22
23 ~CommandObjectStatsEnable() override = default;
24
25 protected:
DoExecute(Args & command,CommandReturnObject & result)26 bool DoExecute(Args &command, CommandReturnObject &result) override {
27 Target &target = GetSelectedOrDummyTarget();
28
29 if (target.GetCollectingStats()) {
30 result.AppendError("statistics already enabled");
31 return false;
32 }
33
34 target.SetCollectingStats(true);
35 result.SetStatus(eReturnStatusSuccessFinishResult);
36 return true;
37 }
38 };
39
40 class CommandObjectStatsDisable : public CommandObjectParsed {
41 public:
CommandObjectStatsDisable(CommandInterpreter & interpreter)42 CommandObjectStatsDisable(CommandInterpreter &interpreter)
43 : CommandObjectParsed(interpreter, "disable",
44 "Disable statistics collection", nullptr,
45 eCommandProcessMustBePaused) {}
46
47 ~CommandObjectStatsDisable() override = default;
48
49 protected:
DoExecute(Args & command,CommandReturnObject & result)50 bool DoExecute(Args &command, CommandReturnObject &result) override {
51 Target &target = GetSelectedOrDummyTarget();
52
53 if (!target.GetCollectingStats()) {
54 result.AppendError("need to enable statistics before disabling them");
55 return false;
56 }
57
58 target.SetCollectingStats(false);
59 result.SetStatus(eReturnStatusSuccessFinishResult);
60 return true;
61 }
62 };
63
64 class CommandObjectStatsDump : public CommandObjectParsed {
65 public:
CommandObjectStatsDump(CommandInterpreter & interpreter)66 CommandObjectStatsDump(CommandInterpreter &interpreter)
67 : CommandObjectParsed(interpreter, "dump", "Dump statistics results",
68 nullptr, eCommandProcessMustBePaused) {}
69
70 ~CommandObjectStatsDump() override = default;
71
72 protected:
DoExecute(Args & command,CommandReturnObject & result)73 bool DoExecute(Args &command, CommandReturnObject &result) override {
74 Target &target = GetSelectedOrDummyTarget();
75
76 uint32_t i = 0;
77 for (auto &stat : target.GetStatistics()) {
78 result.AppendMessageWithFormat(
79 "%s : %u\n",
80 lldb_private::GetStatDescription(
81 static_cast<lldb_private::StatisticKind>(i))
82 .c_str(),
83 stat);
84 i += 1;
85 }
86 result.SetStatus(eReturnStatusSuccessFinishResult);
87 return true;
88 }
89 };
90
CommandObjectStats(CommandInterpreter & interpreter)91 CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
92 : CommandObjectMultiword(interpreter, "statistics",
93 "Print statistics about a debugging session",
94 "statistics <subcommand> [<subcommand-options>]") {
95 LoadSubCommand("enable",
96 CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
97 LoadSubCommand("disable",
98 CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
99 LoadSubCommand("dump",
100 CommandObjectSP(new CommandObjectStatsDump(interpreter)));
101 }
102
103 CommandObjectStats::~CommandObjectStats() = default;
104