aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2022-06-24 10:03:03 -0700
committerJonas Devlieghere <jonas@devlieghere.com>2022-06-24 10:53:15 -0700
commit1e5d5261e2b6637011a65c929828ca8cb0ab8e2e (patch)
tree04a9fccea4276705707fc593c8b751dbe9b443e1
parent4821508d4db75a535d02b8938f81fac6de66cc26 (diff)
downloadllvm-1e5d5261e2b6637011a65c929828ca8cb0ab8e2e.zip
llvm-1e5d5261e2b6637011a65c929828ca8cb0ab8e2e.tar.gz
llvm-1e5d5261e2b6637011a65c929828ca8cb0ab8e2e.tar.bz2
[lldb] Add SystemLogHandler for emitting log messages to the system log
Add a system log handler that emits log messages to the operating system log. In addition to the log handler itself, this patch also introduces a new Host::SystemLog helper function to abstract over writing to the system log. Differential revision: https://reviews.llvm.org/D128321
-rw-r--r--lldb/include/lldb/Host/Host.h11
-rw-r--r--lldb/source/Host/common/Host.cpp10
-rw-r--r--lldb/source/Host/macosx/objcxx/Host.mm15
3 files changed, 36 insertions, 0 deletions
diff --git a/lldb/include/lldb/Host/Host.h b/lldb/include/lldb/Host/Host.h
index b0097a1..b3e0cba 100644
--- a/lldb/include/lldb/Host/Host.h
+++ b/lldb/include/lldb/Host/Host.h
@@ -13,6 +13,7 @@
#include "lldb/Host/HostThread.h"
#include "lldb/Utility/Environment.h"
#include "lldb/Utility/FileSpec.h"
+#include "lldb/Utility/Log.h"
#include "lldb/Utility/Timeout.h"
#include "lldb/lldb-private-forward.h"
#include "lldb/lldb-private.h"
@@ -86,6 +87,9 @@ public:
StartMonitoringChildProcess(const MonitorChildProcessCallback &callback,
lldb::pid_t pid);
+ /// Emit the given message to the operating system log.
+ static void SystemLog(llvm::StringRef message);
+
/// Get the process ID for the calling process.
///
/// \return
@@ -252,6 +256,13 @@ protected:
ProcessInstanceInfoList &proc_infos);
};
+/// Log handler that emits log messages to the operating system log.
+class SystemLogHandler : public LogHandler {
+public:
+ SystemLogHandler();
+ void Emit(llvm::StringRef message) override;
+};
+
} // namespace lldb_private
namespace llvm {
diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp
index 3310425..925ed95 100644
--- a/lldb/source/Host/common/Host.cpp
+++ b/lldb/source/Host/common/Host.cpp
@@ -106,6 +106,10 @@ llvm::Expected<HostThread> Host::StartMonitoringChildProcess(
});
}
+#if !defined(__APPLE__)
+void Host::SystemLog(llvm::StringRef message) { llvm::errs() << message; }
+#endif
+
#ifndef __linux__
// Scoped class that will disable thread canceling when it is constructed, and
// exception safely restore the previous value it when it goes out of scope.
@@ -627,3 +631,9 @@ uint32_t Host::FindProcesses(const ProcessInstanceInfoMatch &match_info,
return result;
}
+
+SystemLogHandler::SystemLogHandler() {}
+
+void SystemLogHandler::Emit(llvm::StringRef message) {
+ Host::SystemLog(message);
+}
diff --git a/lldb/source/Host/macosx/objcxx/Host.mm b/lldb/source/Host/macosx/objcxx/Host.mm
index 4c369e9..1c990c8 100644
--- a/lldb/source/Host/macosx/objcxx/Host.mm
+++ b/lldb/source/Host/macosx/objcxx/Host.mm
@@ -82,6 +82,7 @@
#include "../cfcpp/CFCString.h"
#include <objc/objc-auto.h>
+#include <os/log.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Foundation/Foundation.h>
@@ -98,6 +99,20 @@ int __pthread_fchdir(int fildes);
using namespace lldb;
using namespace lldb_private;
+static os_log_t g_os_log;
+static std::once_flag g_os_log_once;
+
+void Host::SystemLog(llvm::StringRef message) {
+ if (__builtin_available(macos 10.12, iOS 10, tvOS 10, watchOS 3, *)) {
+ std::call_once(g_os_log_once, []() {
+ g_os_log = os_log_create("com.apple.dt.lldb", "lldb");
+ });
+ os_log(g_os_log, "%{public}s", message.str().c_str());
+ } else {
+ llvm::errs() << message;
+ }
+}
+
bool Host::GetBundleDirectory(const FileSpec &file,
FileSpec &bundle_directory) {
#if defined(__APPLE__)