Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions lldb/include/lldb/API/SBStatisticsOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ class LLDB_API SBStatisticsOptions {
/// a JSON array with all commands the user and/or scripts executed during a
/// debug session.
///
/// Defaults to true, unless the `SummaryOnly` mode is enabled, in which case
/// this is turned off unless specified.
/// Defaults to false.
void SetIncludeTranscript(bool b);
bool GetIncludeTranscript() const;

Expand Down
6 changes: 1 addition & 5 deletions lldb/include/lldb/Target/Statistics.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,11 +191,7 @@ struct StatisticsOptions {

void SetIncludeTranscript(bool value) { m_include_transcript = value; }
bool GetIncludeTranscript() const {
if (m_include_transcript.has_value())
return m_include_transcript.value();
// `m_include_transcript` has no value set, so return a value based on
// `m_summary_only`.
return !GetSummaryOnly();
return m_include_transcript.value_or(false);
}

void SetIncludePlugins(bool value) { m_include_plugins = value; }
Expand Down
14 changes: 12 additions & 2 deletions lldb/source/Commands/CommandObjectStats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "CommandObjectStats.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Host/OptionParser.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandOptionArgumentTable.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/OptionArgParser.h"
Expand Down Expand Up @@ -147,9 +148,18 @@ class CommandObjectStatsDump : public CommandObjectParsed {
if (!m_options.m_all_targets)
target = m_exe_ctx.GetTargetPtr();

// Check if transcript is requested but transcript saving is disabled
const StatisticsOptions &stats_options = m_options.GetStatisticsOptions();
if (stats_options.GetIncludeTranscript() &&
!GetDebugger().GetCommandInterpreter().GetSaveTranscript()) {
result.AppendWarning(
"transcript requested but none was saved. Enable with "
"'settings set interpreter.save-transcript true'");
}

result.AppendMessageWithFormatv(
"{0:2}", DebuggerStats::ReportStatistics(
GetDebugger(), target, m_options.GetStatisticsOptions()));
"{0:2}",
DebuggerStats::ReportStatistics(GetDebugger(), target, stats_options));
result.SetStatus(eReturnStatusSuccessFinishResult);
}

Expand Down
16 changes: 9 additions & 7 deletions lldb/source/Commands/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -1482,13 +1482,15 @@ let Command = "statistics dump" in {
"this is turned off unless specified. "
"In default mode, if both '--targets' and '--modules' are 'true', a list "
"of module identifiers will be added to the 'targets' section.">;
def statistics_dump_transcript: Option<"transcript", "t">, Group<1>,
Arg<"Boolean">,
Desc<"If the setting interpreter.save-transcript is enabled and this "
"option is 'true', include a JSON array with all commands the user and/or "
"scripts executed during a debug session. "
"Defaults to true, unless the '--summary' mode is enabled, in which case "
"this is turned off unless specified.">;
def statistics_dump_transcript
: Option<"transcript", "t">,
Group<1>,
Arg<"Boolean">,
Desc<"If the setting interpreter.save-transcript is enabled and this "
"option is 'true', include a JSON array with all commands the "
"user and/or "
"scripts executed during a debug session. "
"Defaults to false. ">;
def statistics_dump_plugins
: Option<"plugins", "p">,
Group<1>,
Expand Down
61 changes: 60 additions & 1 deletion lldb/test/API/commands/statistics/basic/TestStats.py
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,30 @@ def test_transcript_happy_path(self):
# The second "statistics dump" in the transcript should have no output
self.assertNotIn("output", transcript[2])

def test_transcript_warning_when_disabled(self):
"""
Test that "statistics dump --transcript=true" shows a warning when
transcript saving is disabled.
"""
self.build()
exe = self.getBuildArtifact("a.out")
target = self.createTestTarget(file_path=exe)

# Ensure transcript saving is disabled (this is the default)
self.runCmd("settings set interpreter.save-transcript false")

# Request transcript in statistics dump and check for warning
interpreter = self.dbg.GetCommandInterpreter()
res = lldb.SBCommandReturnObject()
interpreter.HandleCommand("statistics dump --transcript=true", res)
self.assertTrue(res.Succeeded())
# We should warn about transcript being requested but not saved
self.assertIn(
"transcript requested but none was saved. Enable with "
"'settings set interpreter.save-transcript true'",
res.GetError(),
)

def verify_stats(self, stats, expectation, options):
for field_name in expectation:
idx = field_name.find(".")
Expand Down Expand Up @@ -896,7 +920,7 @@ def get_test_cases_for_sections_existence(self):
"targets.frameVariable": True,
"targets.totalSharedLibraryEventHitCount": True,
"modules": True,
"transcript": True,
"transcript": False,
},
},
{ # Summary mode
Expand Down Expand Up @@ -983,6 +1007,24 @@ def get_test_cases_for_sections_existence(self):
"transcript": False,
},
},
{ # Default mode without modules and with transcript
"command_options": " --modules=false --transcript=true",
"api_options": {
"SetIncludeModules": False,
"SetIncludeTranscript": True,
},
"expect": {
"commands": True,
"targets": True,
"targets.moduleIdentifiers": False,
"targets.breakpoints": True,
"targets.expressionEvaluation": True,
"targets.frameVariable": True,
"targets.totalSharedLibraryEventHitCount": True,
"modules": False,
"transcript": True,
},
},
{ # Default mode without modules
"command_options": " --modules=false",
"api_options": {
Expand All @@ -997,6 +1039,23 @@ def get_test_cases_for_sections_existence(self):
"targets.frameVariable": True,
"targets.totalSharedLibraryEventHitCount": True,
"modules": False,
"transcript": False,
},
},
{ # Default mode with transcript
"command_options": " --transcript=true",
"api_options": {
"SetIncludeTranscript": True,
},
"expect": {
"commands": True,
"targets": True,
"targets.moduleIdentifiers": True,
"targets.breakpoints": True,
"targets.expressionEvaluation": True,
"targets.frameVariable": True,
"targets.totalSharedLibraryEventHitCount": True,
"modules": True,
"transcript": True,
},
},
Expand Down
Loading