From 9d311dd6a71ba3910554b81fec5e6d5799ce0453 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Tue, 7 Mar 2023 15:59:30 -0800 Subject: [PATCH] [lldb] Copy log files into diagnostic directory This patch copies over log files to the diagnostic directory. The caveat here is that this only works for logs that are redirected to a file. The implementation piggybacks of the mapping kept by the debugger. The advantage is that it's free until you generate the diagnostics, at which point you only pay the price of copying over the file. Differential revision: https://reviews.llvm.org/D135631 --- lldb/include/lldb/Core/Debugger.h | 2 ++ lldb/source/Core/Debugger.cpp | 20 +++++++++++++++++++- lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in | 1 + lldb/test/Shell/Diagnostics/TestCopyLogs.test | 7 +++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in create mode 100644 lldb/test/Shell/Diagnostics/TestCopyLogs.test diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 07d9cf2..3d2a378 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -28,6 +28,7 @@ #include "lldb/Target/TargetList.h" #include "lldb/Utility/Broadcaster.h" #include "lldb/Utility/ConstString.h" +#include "lldb/Utility/Diagnostics.h" #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UserID.h" @@ -596,6 +597,7 @@ protected: lldb::ListenerSP m_forward_listener_sp; llvm::once_flag m_clear_once; lldb::TargetSP m_dummy_target_sp; + Diagnostics::CallbackID m_diagnostics_callback_id; lldb_private::DebuggerDestroyCallback m_destroy_callback = nullptr; void *m_destroy_callback_baton = nullptr; diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index ae03ead..273660d 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -44,7 +44,6 @@ #include "lldb/Target/Thread.h" #include "lldb/Target/ThreadList.h" #include "lldb/Utility/AnsiTerminal.h" -#include "lldb/Utility/Diagnostics.h" #include "lldb/Utility/Event.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Listener.h" @@ -842,6 +841,22 @@ Debugger::Debugger(lldb::LogOutputCallback log_callback, void *baton) if (!GetOutputFile().GetIsTerminalWithColors()) SetUseColor(false); + if (Diagnostics::Enabled()) { + m_diagnostics_callback_id = Diagnostics::Instance().AddCallback( + [this](const FileSpec &dir) -> llvm::Error { + for (auto &entry : m_stream_handlers) { + llvm::StringRef log_path = entry.first(); + llvm::StringRef file_name = llvm::sys::path::filename(log_path); + FileSpec destination = dir.CopyByAppendingPathComponent(file_name); + std::error_code ec = + llvm::sys::fs::copy_file(log_path, destination.GetPath()); + if (ec) + return llvm::errorCodeToError(ec); + } + return llvm::Error::success(); + }); + } + #if defined(_WIN32) && defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING) // Enabling use of ANSI color codes because LLDB is using them to highlight // text. @@ -880,6 +895,9 @@ void Debugger::Clear() { GetInputFile().Close(); m_command_interpreter_up->Clear(); + + if (Diagnostics::Enabled()) + Diagnostics::Instance().RemoveCallback(m_diagnostics_callback_id); }); } diff --git a/lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in b/lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in new file mode 100644 index 0000000..ae9e953 --- /dev/null +++ b/lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in @@ -0,0 +1 @@ +command alias logcommands log enable lldb commands diff --git a/lldb/test/Shell/Diagnostics/TestCopyLogs.test b/lldb/test/Shell/Diagnostics/TestCopyLogs.test new file mode 100644 index 0000000..4706a18 --- /dev/null +++ b/lldb/test/Shell/Diagnostics/TestCopyLogs.test @@ -0,0 +1,7 @@ +# RUN: rm -rf %t +# RUN: mkdir -p %t + +# RUN: %lldb -s %S/Inputs/TestCopyLogs.in -o 'logcommands -f %t/commands.log' -o 'diagnostics dump -d %t/diags' + +# RUN: cat %t/diags/commands.log | FileCheck %s +# CHECK: Processing command: diagnostics dump -- 2.7.4