[lldb] Remove Debugger::Get{Output,Error}Stream (NFC) (#126821)

Remove Debugger::GetOutputStream and Debugger::GetErrorStream in
preparation for replacing both with a new variant that needs to be
locked and hence can't be handed out like we do right now.

The patch replaces most uses with GetAsyncOutputStream and
GetAsyncErrorStream respectively. There methods return new StreamSP
objects that automatically get flushed on destruction.

See #126630 for more details.
This commit is contained in:
Jonas Devlieghere 2025-02-12 08:29:06 -08:00 committed by GitHub
parent bee9664970
commit eff3c343b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 95 additions and 109 deletions

View file

@ -143,10 +143,6 @@ public:
File &GetErrorFile() { return m_error_stream_sp->GetFile(); }
StreamFile &GetOutputStream() { return *m_output_stream_sp; }
StreamFile &GetErrorStream() { return *m_error_stream_sp; }
repro::DataRecorder *GetInputRecorder();
Status SetInputString(const char *data);

View file

@ -508,39 +508,31 @@ SBFile SBDebugger::GetInputFile() {
FILE *SBDebugger::GetOutputFileHandle() {
LLDB_INSTRUMENT_VA(this);
if (m_opaque_sp) {
StreamFile &stream_file = m_opaque_sp->GetOutputStream();
return stream_file.GetFile().GetStream();
}
if (m_opaque_sp)
return m_opaque_sp->GetOutputStreamSP()->GetFile().GetStream();
return nullptr;
}
SBFile SBDebugger::GetOutputFile() {
LLDB_INSTRUMENT_VA(this);
if (m_opaque_sp) {
SBFile file(m_opaque_sp->GetOutputStream().GetFileSP());
return file;
}
if (m_opaque_sp)
return SBFile(m_opaque_sp->GetOutputStreamSP()->GetFileSP());
return SBFile();
}
FILE *SBDebugger::GetErrorFileHandle() {
LLDB_INSTRUMENT_VA(this);
if (m_opaque_sp) {
StreamFile &stream_file = m_opaque_sp->GetErrorStream();
return stream_file.GetFile().GetStream();
}
if (m_opaque_sp)
return m_opaque_sp->GetErrorStreamSP()->GetFile().GetStream();
return nullptr;
}
SBFile SBDebugger::GetErrorFile() {
LLDB_INSTRUMENT_VA(this);
SBFile file;
if (m_opaque_sp) {
SBFile file(m_opaque_sp->GetErrorStream().GetFileSP());
return file;
}
if (m_opaque_sp)
return SBFile(m_opaque_sp->GetErrorStreamSP()->GetFileSP());
return SBFile();
}
@ -581,8 +573,8 @@ void SBDebugger::HandleCommand(const char *command) {
sb_interpreter.HandleCommand(command, result, false);
result.PutError(m_opaque_sp->GetErrorStream().GetFileSP());
result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP());
result.PutError(m_opaque_sp->GetErrorStreamSP()->GetFileSP());
result.PutOutput(m_opaque_sp->GetOutputStreamSP()->GetFileSP());
if (!m_opaque_sp->GetAsyncExecution()) {
SBProcess process(GetCommandInterpreter().GetProcess());

View file

@ -257,12 +257,11 @@ Status Debugger::SetPropertyValue(const ExecutionContext *exe_ctx,
std::list<Status> errors;
StreamString feedback_stream;
if (!target_sp->LoadScriptingResources(errors, feedback_stream)) {
Stream &s = GetErrorStream();
for (auto &error : errors) {
s.Printf("%s\n", error.AsCString());
}
lldb::StreamSP s = GetAsyncErrorStream();
for (auto &error : errors)
s->Printf("%s\n", error.AsCString());
if (feedback_stream.GetSize())
s.PutCString(feedback_stream.GetString());
s->PutCString(feedback_stream.GetString());
}
}
}

View file

@ -263,7 +263,7 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
module_sp = std::make_shared<Module>(module_spec);
} else if (force_symbol_search && error.AsCString("") &&
error.AsCString("")[0] != '\0') {
target.GetDebugger().GetErrorStream() << error.AsCString();
*target.GetDebugger().GetAsyncErrorStream() << error.AsCString();
}
}
@ -328,19 +328,19 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
}
} else {
if (force_symbol_search) {
Stream &s = target.GetDebugger().GetErrorStream();
s.Printf("Unable to find file");
lldb::StreamSP s = target.GetDebugger().GetAsyncErrorStream();
s->Printf("Unable to find file");
if (!name.empty())
s.Printf(" %s", name.str().c_str());
s->Printf(" %s", name.str().c_str());
if (uuid.IsValid())
s.Printf(" with UUID %s", uuid.GetAsString().c_str());
s->Printf(" with UUID %s", uuid.GetAsString().c_str());
if (value != LLDB_INVALID_ADDRESS) {
if (value_is_offset)
s.Printf(" with slide 0x%" PRIx64, value);
s->Printf(" with slide 0x%" PRIx64, value);
else
s.Printf(" at address 0x%" PRIx64, value);
s->Printf(" at address 0x%" PRIx64, value);
}
s.Printf("\n");
s->Printf("\n");
}
LLDB_LOGF(log,
"Unable to find binary %s with UUID %s and load it at "

View file

@ -245,8 +245,8 @@ ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(
if (outfile_handle)
::setbuf(outfile_handle, nullptr);
result->SetImmediateOutputFile(debugger.GetOutputStream().GetFileSP());
result->SetImmediateErrorFile(debugger.GetErrorStream().GetFileSP());
result->SetImmediateOutputFile(debugger.GetOutputStreamSP()->GetFileSP());
result->SetImmediateErrorFile(debugger.GetErrorStreamSP()->GetFileSP());
}
}

View file

@ -738,9 +738,9 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
}
if (IsKernel() && m_uuid.IsValid()) {
Stream &s = target.GetDebugger().GetOutputStream();
s.Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
s.Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
s->Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
s->Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
// Start of a kernel debug session, we have the UUID of the kernel.
// Go through the target's list of modules and if there are any kernel
@ -830,12 +830,12 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
}
if (IsKernel() && !m_module_sp) {
Stream &s = target.GetDebugger().GetErrorStream();
s.Printf("WARNING: Unable to locate kernel binary on the debugger "
"system.\n");
lldb::StreamSP s = target.GetDebugger().GetAsyncErrorStream();
s->Printf("WARNING: Unable to locate kernel binary on the debugger "
"system.\n");
if (kernel_search_error.Fail() && kernel_search_error.AsCString("") &&
kernel_search_error.AsCString("")[0] != '\0') {
s << kernel_search_error.AsCString();
*s << kernel_search_error.AsCString();
}
}
}
@ -974,22 +974,19 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
bool is_loaded = IsLoaded();
if (is_loaded && m_module_sp && IsKernel()) {
Stream &s = target.GetDebugger().GetOutputStream();
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
ObjectFile *kernel_object_file = m_module_sp->GetObjectFile();
if (kernel_object_file) {
addr_t file_address =
kernel_object_file->GetBaseAddress().GetFileAddress();
if (m_load_address != LLDB_INVALID_ADDRESS &&
file_address != LLDB_INVALID_ADDRESS) {
s.Printf("Kernel slid 0x%" PRIx64 " in memory.\n",
m_load_address - file_address);
s->Printf("Kernel slid 0x%" PRIx64 " in memory.\n",
m_load_address - file_address);
}
}
{
s.Printf("Loaded kernel file %s\n",
m_module_sp->GetFileSpec().GetPath().c_str());
}
s.Flush();
s->Printf("Loaded kernel file %s\n",
m_module_sp->GetFileSpec().GetPath().c_str());
}
// Notify the target about the module being added;
@ -1195,10 +1192,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
lldb::offset_t offset = 0;
m_kext_summary_header.version = data.GetU32(&offset);
if (m_kext_summary_header.version > 128) {
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
s.Printf("WARNING: Unable to read kext summary header, got "
"improbable version number %u\n",
m_kext_summary_header.version);
lldb::StreamSP s =
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
s->Printf("WARNING: Unable to read kext summary header, got "
"improbable version number %u\n",
m_kext_summary_header.version);
// If we get an improbably large version number, we're probably
// getting bad memory.
m_kext_summary_header_addr.Clear();
@ -1209,11 +1207,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
if (m_kext_summary_header.entry_size > 4096) {
// If we get an improbably large entry_size, we're probably
// getting bad memory.
Stream &s =
m_process->GetTarget().GetDebugger().GetOutputStream();
s.Printf("WARNING: Unable to read kext summary header, got "
"improbable entry_size %u\n",
m_kext_summary_header.entry_size);
lldb::StreamSP s =
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
s->Printf("WARNING: Unable to read kext summary header, got "
"improbable entry_size %u\n",
m_kext_summary_header.entry_size);
m_kext_summary_header_addr.Clear();
return false;
}
@ -1227,10 +1225,11 @@ bool DynamicLoaderDarwinKernel::ReadKextSummaryHeader() {
if (m_kext_summary_header.entry_count > 10000) {
// If we get an improbably large number of kexts, we're probably
// getting bad memory.
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
s.Printf("WARNING: Unable to read kext summary header, got "
"improbable number of kexts %u\n",
m_kext_summary_header.entry_count);
lldb::StreamSP s =
m_process->GetTarget().GetDebugger().GetOutputStreamSP();
s->Printf("WARNING: Unable to read kext summary header, got "
"improbable number of kexts %u\n",
m_kext_summary_header.entry_count);
m_kext_summary_header_addr.Clear();
return false;
}
@ -1331,17 +1330,18 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
number_of_old_kexts_being_removed == 0)
return true;
Stream &s = m_process->GetTarget().GetDebugger().GetOutputStream();
lldb::StreamSP s = m_process->GetTarget().GetDebugger().GetOutputStreamSP();
if (load_kexts) {
if (number_of_new_kexts_being_added > 0 &&
number_of_old_kexts_being_removed > 0) {
s.Printf("Loading %d kext modules and unloading %d kext modules ",
number_of_new_kexts_being_added,
number_of_old_kexts_being_removed);
s->Printf("Loading %d kext modules and unloading %d kext modules ",
number_of_new_kexts_being_added,
number_of_old_kexts_being_removed);
} else if (number_of_new_kexts_being_added > 0) {
s.Printf("Loading %d kext modules ", number_of_new_kexts_being_added);
s->Printf("Loading %d kext modules ", number_of_new_kexts_being_added);
} else if (number_of_old_kexts_being_removed > 0) {
s.Printf("Unloading %d kext modules ", number_of_old_kexts_being_removed);
s->Printf("Unloading %d kext modules ",
number_of_old_kexts_being_removed);
}
}
@ -1405,7 +1405,7 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
if (image_info.GetModule()) {
unloaded_module_list.AppendIfNeeded(image_info.GetModule());
}
s.Printf(".");
s->Printf(".");
image_info.Clear();
// should pull it out of the KextImageInfos vector but that would
// mutate the list and invalidate the to_be_removed bool vector;
@ -1417,11 +1417,11 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
}
if (load_kexts) {
s.Printf(" done.\n");
s->Printf(" done.\n");
if (kexts_failed_to_load.size() > 0 && number_of_new_kexts_being_added > 0) {
s.Printf("Failed to load %d of %d kexts:\n",
(int)kexts_failed_to_load.size(),
number_of_new_kexts_being_added);
s->Printf("Failed to load %d of %d kexts:\n",
(int)kexts_failed_to_load.size(),
number_of_new_kexts_being_added);
// print a sorted list of <kext-name, uuid> kexts which failed to load
unsigned longest_name = 0;
std::sort(kexts_failed_to_load.begin(), kexts_failed_to_load.end());
@ -1433,10 +1433,9 @@ bool DynamicLoaderDarwinKernel::ParseKextSummaries(
std::string uuid;
if (ku.second.IsValid())
uuid = ku.second.GetAsString();
s.Printf(" %-*s %s\n", longest_name, ku.first.c_str(), uuid.c_str());
s->Printf(" %-*s %s\n", longest_name, ku.first.c_str(), uuid.c_str());
}
}
s.Flush();
}
return true;

View file

@ -327,9 +327,9 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
Target &target = process->GetTarget();
if (IsKernel() && m_uuid.IsValid()) {
Stream &s = target.GetDebugger().GetOutputStream();
s.Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
s.Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
s->Printf("Kernel UUID: %s\n", m_uuid.GetAsString().c_str());
s->Printf("Load Address: 0x%" PRIx64 "\n", m_load_address);
}
// Test if the module is loaded into the taget,
@ -355,9 +355,9 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
if (!m_module_sp)
m_module_sp = target.GetOrCreateModule(module_spec, true);
if (IsKernel() && !m_module_sp) {
Stream &s = target.GetDebugger().GetOutputStream();
s.Printf("WARNING: Unable to locate kernel binary on the debugger "
"system.\n");
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
s->Printf("WARNING: Unable to locate kernel binary on the debugger "
"system.\n");
}
}
@ -464,20 +464,19 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
}
if (IsLoaded() && m_module_sp && IsKernel()) {
Stream &s = target.GetDebugger().GetOutputStream();
lldb::StreamSP s = target.GetDebugger().GetAsyncOutputStream();
ObjectFile *kernel_object_file = m_module_sp->GetObjectFile();
if (kernel_object_file) {
addr_t file_address =
kernel_object_file->GetBaseAddress().GetFileAddress();
if (m_load_address != LLDB_INVALID_ADDRESS &&
file_address != LLDB_INVALID_ADDRESS) {
s.Printf("Kernel slide 0x%" PRIx64 " in memory.\n",
m_load_address - file_address);
s.Printf("Loaded kernel file %s\n",
m_module_sp->GetFileSpec().GetPath().c_str());
s->Printf("Kernel slide 0x%" PRIx64 " in memory.\n",
m_load_address - file_address);
s->Printf("Loaded kernel file %s\n",
m_module_sp->GetFileSpec().GetPath().c_str());
}
}
s.Flush();
}
return IsLoaded();

View file

@ -864,13 +864,14 @@ bool InstrumentationRuntimeTSan::NotifyBreakpointHit(
CreateStopReasonWithInstrumentationData(
*thread_sp, stop_reason_description, report));
StreamFile &s = process_sp->GetTarget().GetDebugger().GetOutputStream();
s.Printf("ThreadSanitizer report breakpoint hit. Use 'thread "
"info -s' to get extended information about the "
"report.\n");
lldb::StreamSP s =
process_sp->GetTarget().GetDebugger().GetAsyncOutputStream();
s->Printf("ThreadSanitizer report breakpoint hit. Use 'thread "
"info -s' to get extended information about the "
"report.\n");
return true; // Return true to stop the target
} else
}
return false; // Let target run
}

View file

@ -622,14 +622,14 @@ AppleObjCTrampolineHandler::AppleObjCTrampolineHandler(
// step through any method dispatches. Warn to that effect and get out of
// here.
if (process_sp->CanJIT()) {
process_sp->GetTarget().GetDebugger().GetErrorStream().Printf(
process_sp->GetTarget().GetDebugger().GetAsyncErrorStream()->Printf(
"Could not find implementation lookup function \"%s\""
" step in through ObjC method dispatch will not work.\n",
get_impl_name.AsCString());
}
return;
}
// We will either set the implementation to the _stret or non_stret version,
// so either way it's safe to start filling the m_lookup_..._code here.
m_lookup_implementation_function_code.assign(

View file

@ -289,7 +289,7 @@ bool ScriptInterpreterLua::BreakpointCallbackFunction(
llvm::Expected<bool> BoolOrErr = lua.CallBreakpointCallback(
baton, stop_frame_sp, bp_loc_sp, bp_option_data->m_extra_args_sp);
if (llvm::Error E = BoolOrErr.takeError()) {
debugger.GetErrorStream() << toString(std::move(E));
*debugger.GetAsyncErrorStream() << toString(std::move(E));
return true;
}
@ -316,7 +316,7 @@ bool ScriptInterpreterLua::WatchpointCallbackFunction(
llvm::Expected<bool> BoolOrErr =
lua.CallWatchpointCallback(baton, stop_frame_sp, wp_sp);
if (llvm::Error E = BoolOrErr.takeError()) {
debugger.GetErrorStream() << toString(std::move(E));
*debugger.GetAsyncErrorStream() << toString(std::move(E));
return true;
}

View file

@ -33,12 +33,12 @@ static const char *no_interpreter_err_msg =
bool ScriptInterpreterNone::ExecuteOneLine(llvm::StringRef command,
CommandReturnObject *,
const ExecuteScriptOptions &) {
m_debugger.GetErrorStream().PutCString(no_interpreter_err_msg);
m_debugger.GetAsyncErrorStream()->PutCString(no_interpreter_err_msg);
return false;
}
void ScriptInterpreterNone::ExecuteInterpreterLoop() {
m_debugger.GetErrorStream().PutCString(no_interpreter_err_msg);
m_debugger.GetAsyncErrorStream()->PutCString(no_interpreter_err_msg);
}
void ScriptInterpreterNone::Initialize() {

View file

@ -1910,10 +1910,10 @@ bool ScriptInterpreterPythonImpl::BreakpointCallbackFunction(
llvm::handleAllErrors(
maybe_ret_val.takeError(),
[&](PythonException &E) {
debugger.GetErrorStream() << E.ReadBacktrace();
*debugger.GetAsyncErrorStream() << E.ReadBacktrace();
},
[&](const llvm::ErrorInfoBase &E) {
debugger.GetErrorStream() << E.message();
*debugger.GetAsyncErrorStream() << E.message();
});
} else {

View file

@ -1664,7 +1664,7 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
Address symbol_address = symbol->GetAddress();
load_addr = ResolveIndirectFunction(&symbol_address, error);
if (!error.Success() && show_error) {
GetTarget().GetDebugger().GetErrorStream().Printf(
GetTarget().GetDebugger().GetAsyncErrorStream()->Printf(
"warning: failed to resolve indirect function at 0x%" PRIx64
" for breakpoint %i.%i: %s\n",
symbol->GetLoadAddress(&GetTarget()),
@ -1703,7 +1703,7 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
} else {
if (show_error || use_hardware) {
// Report error for setting breakpoint...
GetTarget().GetDebugger().GetErrorStream().Printf(
GetTarget().GetDebugger().GetAsyncErrorStream()->Printf(
"warning: failed to set breakpoint site at 0x%" PRIx64
" for breakpoint %i.%i: %s\n",
load_addr, constituent->GetBreakpoint().GetID(),

View file

@ -1532,15 +1532,15 @@ static void LoadScriptingResourceForModule(const ModuleSP &module_sp,
if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error,
feedback_stream)) {
if (error.AsCString())
target->GetDebugger().GetErrorStream().Printf(
target->GetDebugger().GetAsyncErrorStream()->Printf(
"unable to load scripting data for module %s - error reported was "
"%s\n",
module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
error.AsCString());
}
if (feedback_stream.GetSize())
target->GetDebugger().GetErrorStream().Printf("%s\n",
feedback_stream.GetData());
target->GetDebugger().GetAsyncErrorStream()->Printf(
"%s\n", feedback_stream.GetData());
}
void Target::ClearModules(bool delete_locations) {

View file

@ -47,7 +47,7 @@ Stream *ThreadPlanTracer::GetLogStream() {
else {
TargetSP target_sp(GetThread().CalculateTarget());
if (target_sp)
return &(target_sp->GetDebugger().GetOutputStream());
return target_sp->GetDebugger().GetOutputStreamSP().get();
}
return nullptr;
}