Skip to content

Commit

Permalink
[lldb] Copy log files into diagnostic directory
Browse files Browse the repository at this point in the history
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
  • Loading branch information
JDevlieghere committed Mar 8, 2023
1 parent bfb1805 commit 9d311dd
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 1 deletion.
2 changes: 2 additions & 0 deletions lldb/include/lldb/Core/Debugger.h
Expand Up @@ -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"
Expand Down Expand Up @@ -596,6 +597,7 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
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;
Expand Down
20 changes: 19 additions & 1 deletion lldb/source/Core/Debugger.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -880,6 +895,9 @@ void Debugger::Clear() {
GetInputFile().Close();

m_command_interpreter_up->Clear();

if (Diagnostics::Enabled())
Diagnostics::Instance().RemoveCallback(m_diagnostics_callback_id);
});
}

Expand Down
1 change: 1 addition & 0 deletions lldb/test/Shell/Diagnostics/Inputs/TestCopyLogs.in
@@ -0,0 +1 @@
command alias logcommands log enable lldb commands
7 changes: 7 additions & 0 deletions 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

0 comments on commit 9d311dd

Please sign in to comment.