forked from OSchip/llvm-project
[lldb] Don't print script output twice in HandleCommand
When executing a script command in HandleCommand(s) we currently print its output twice You can see this issue in action when adding a breakpoint command: (lldb) b main Breakpoint 1: where = main.out`main + 13 at main.cpp:2:3, address = 0x0000000100003fad (lldb) break command add 1 -o "script print(\"Hey!\")" (lldb) r Process 76041 launched: '/tmp/main.out' (x86_64) Hey! (lldb) script print("Hey!") Hey! Process 76041 stopped The issue is caused by HandleCommands using a temporary CommandReturnObject and one of the commands (`script` in this case) setting an immediate output stream. This causes the result to be printed twice: once directly to the immediate output stream and once when printing the result of HandleCommands. This patch fixes the issue by introducing a new option to suppress immediate output for temporary CommandReturnObjects. Differential revision: https://reviews.llvm.org/D103349
This commit is contained in:
parent
0178ae734c
commit
1a216fb15a
|
@ -63,20 +63,28 @@ public:
|
|||
}
|
||||
|
||||
void SetImmediateOutputFile(lldb::FileSP file_sp) {
|
||||
if (m_suppress_immediate_output)
|
||||
return;
|
||||
lldb::StreamSP stream_sp(new StreamFile(file_sp));
|
||||
m_out_stream.SetStreamAtIndex(eImmediateStreamIndex, stream_sp);
|
||||
}
|
||||
|
||||
void SetImmediateErrorFile(lldb::FileSP file_sp) {
|
||||
if (m_suppress_immediate_output)
|
||||
return;
|
||||
lldb::StreamSP stream_sp(new StreamFile(file_sp));
|
||||
m_err_stream.SetStreamAtIndex(eImmediateStreamIndex, stream_sp);
|
||||
}
|
||||
|
||||
void SetImmediateOutputStream(const lldb::StreamSP &stream_sp) {
|
||||
if (m_suppress_immediate_output)
|
||||
return;
|
||||
m_out_stream.SetStreamAtIndex(eImmediateStreamIndex, stream_sp);
|
||||
}
|
||||
|
||||
void SetImmediateErrorStream(const lldb::StreamSP &stream_sp) {
|
||||
if (m_suppress_immediate_output)
|
||||
return;
|
||||
m_err_stream.SetStreamAtIndex(eImmediateStreamIndex, stream_sp);
|
||||
}
|
||||
|
||||
|
@ -142,16 +150,23 @@ public:
|
|||
|
||||
void SetInteractive(bool b);
|
||||
|
||||
bool GetSuppressImmediateOutput() const;
|
||||
|
||||
void SetSuppressImmediateOutput(bool b);
|
||||
|
||||
private:
|
||||
enum { eStreamStringIndex = 0, eImmediateStreamIndex = 1 };
|
||||
|
||||
StreamTee m_out_stream;
|
||||
StreamTee m_err_stream;
|
||||
|
||||
lldb::ReturnStatus m_status;
|
||||
bool m_did_change_process_state;
|
||||
bool m_interactive; // If true, then the input handle from the debugger will
|
||||
// be hooked up
|
||||
lldb::ReturnStatus m_status = lldb::eReturnStatusStarted;
|
||||
|
||||
bool m_did_change_process_state = false;
|
||||
bool m_suppress_immediate_output = false;
|
||||
|
||||
/// If true, then the input handle from the debugger will be hooked up.
|
||||
bool m_interactive = true;
|
||||
};
|
||||
|
||||
} // namespace lldb_private
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# RUN: %build %p/Inputs/dummy-target.c -o %t.out
|
||||
# RUN: %lldb %t.out -o 'b main' -o 'break command add 1 -o "script print(95000 + 126)"' -o 'r'
|
||||
|
||||
# CHECK: 95125
|
||||
# CHECK-NOT: 95126
|
|
@ -2306,6 +2306,7 @@ void CommandInterpreter::HandleCommands(const StringList &commands,
|
|||
|
||||
CommandReturnObject tmp_result(m_debugger.GetUseColor());
|
||||
tmp_result.SetInteractive(result.GetInteractive());
|
||||
tmp_result.SetSuppressImmediateOutput(true);
|
||||
|
||||
// We might call into a regex or alias command, in which case the
|
||||
// add_to_history will get lost. This m_command_source_depth dingus is the
|
||||
|
|
|
@ -41,9 +41,7 @@ static void DumpStringToStreamWithNewline(Stream &strm, const std::string &s) {
|
|||
}
|
||||
|
||||
CommandReturnObject::CommandReturnObject(bool colors)
|
||||
: m_out_stream(colors), m_err_stream(colors),
|
||||
m_status(eReturnStatusStarted), m_did_change_process_state(false),
|
||||
m_interactive(true) {}
|
||||
: m_out_stream(colors), m_err_stream(colors) {}
|
||||
|
||||
void CommandReturnObject::AppendErrorWithFormat(const char *format, ...) {
|
||||
SetStatus(eReturnStatusFailed);
|
||||
|
@ -154,6 +152,7 @@ void CommandReturnObject::Clear() {
|
|||
static_cast<StreamString *>(stream_sp.get())->Clear();
|
||||
m_status = eReturnStatusStarted;
|
||||
m_did_change_process_state = false;
|
||||
m_suppress_immediate_output = false;
|
||||
m_interactive = true;
|
||||
}
|
||||
|
||||
|
@ -168,3 +167,11 @@ void CommandReturnObject::SetDidChangeProcessState(bool b) {
|
|||
bool CommandReturnObject::GetInteractive() const { return m_interactive; }
|
||||
|
||||
void CommandReturnObject::SetInteractive(bool b) { m_interactive = b; }
|
||||
|
||||
bool CommandReturnObject::GetSuppressImmediateOutput() const {
|
||||
return m_suppress_immediate_output;
|
||||
}
|
||||
|
||||
void CommandReturnObject::SetSuppressImmediateOutput(bool b) {
|
||||
m_suppress_immediate_output = b;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# RUN: %build %p/Inputs/dummy-target.c -o %t.out
|
||||
# RUN: %lldb %t.out -o 'b main' -o 'break command add 1 -o "script print(95000 + 126)"' -o 'r'
|
||||
|
||||
# CHECK: 95125
|
||||
# CHECK-NOT: 95126
|
|
@ -7,6 +7,5 @@
|
|||
# CHECK-NEXT: foo foo
|
||||
# CHECK-NEXT: foo bar
|
||||
# CHECK-NEXT: foo bar
|
||||
# CHECK-NEXT: foo bar
|
||||
# CHECK: script
|
||||
# CHECK-NEXT: bar bar
|
||||
|
|
Loading…
Reference in New Issue