forked from OSchip/llvm-project
[lldb] Make sure we don't drop asynchronous output when sourcing files
Summary: If a command from a sourced file produces asynchronous output, this output often does not make its way to the user. This happens because the asynchronous output machinery relies on the iohandler stack to ensure the output does not interfere with the things the iohandler is doing. However, if this happens near the end of the command stream then by the time the asynchronous output is produced we may already have already started tearing down the sourcing session. Specifically, we may already pop the relevant iohandler, leaving the stack empty. This patch makes sure this kind of output gets printed by adding a fallback to IOHandlerStack::PrintAsync to print the output directly if the stack is empty. This is safe because if we have no iohandlers then there is nothing to synchronize. Reviewers: JDevlieghere, clayborg Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D75454
This commit is contained in:
parent
b0ae20d92e
commit
4deea65249
|
@ -125,6 +125,8 @@ void IOHandlerStack::PrintAsync(Stream *stream, const char *s, size_t len) {
|
||||||
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
||||||
if (m_top)
|
if (m_top)
|
||||||
m_top->PrintAsync(stream, s, len);
|
m_top->PrintAsync(stream, s, len);
|
||||||
|
else
|
||||||
|
stream->Write(s, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
# RUN: %clang_host -g %S/Inputs/main.c -o %t
|
||||||
|
# RUN: %lldb %t -s %s -o exit | FileCheck %s
|
||||||
|
|
||||||
|
b main
|
||||||
|
# CHECK-LABEL: b main
|
||||||
|
# CHECK: Breakpoint 1: where = {{.*}}`main
|
||||||
|
|
||||||
|
run
|
||||||
|
# CHECK-LABEL: run
|
||||||
|
# CHECK: Process {{.*}} stopped
|
||||||
|
# CHECK: stop reason = breakpoint 1
|
||||||
|
# CHECK: frame #0: {{.*}}`main at main.c
|
||||||
|
|
||||||
|
thread select 1
|
||||||
|
# CHECK-LABEL: thread select 1
|
||||||
|
# CHECK: stop reason = breakpoint 1
|
||||||
|
# CHECK: frame #0: {{.*}}`main at main.c
|
Loading…
Reference in New Issue