1 //===-- OsLogger.cpp --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "OsLogger.h" 11 #include <Availability.h> 12 13 #if (LLDB_USE_OS_LOG) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101200) 14 15 #include <os/log.h> 16 17 #include "DNBDefs.h" 18 #include "DNBLog.h" 19 20 #define LLDB_OS_LOG_MAX_BUFFER_LENGTH 256 21 22 namespace { 23 //---------------------------------------------------------------------- 24 // Darwin os_log logging callback that can be registered with 25 // DNBLogSetLogCallback 26 //---------------------------------------------------------------------- 27 void DarwinLogCallback(void *baton, uint32_t flags, const char *format, 28 va_list args) { 29 if (format == nullptr) 30 return; 31 32 static os_log_t g_logger; 33 if (!g_logger) { 34 g_logger = os_log_create("com.apple.dt.lldb", "debugserver"); 35 if (!g_logger) 36 return; 37 } 38 39 os_log_type_t log_type; 40 if (flags & DNBLOG_FLAG_FATAL) 41 log_type = OS_LOG_TYPE_FAULT; 42 else if (flags & DNBLOG_FLAG_ERROR) 43 log_type = OS_LOG_TYPE_ERROR; 44 else if (flags & DNBLOG_FLAG_WARNING) 45 log_type = OS_LOG_TYPE_DEFAULT; 46 else if (flags & DNBLOG_FLAG_VERBOSE) 47 log_type = OS_LOG_TYPE_DEBUG; 48 else 49 log_type = OS_LOG_TYPE_DEFAULT; 50 51 // This code is unfortunate. os_log* only takes static strings, but 52 // our current log API isn't set up to make use of that style. 53 char buffer[LLDB_OS_LOG_MAX_BUFFER_LENGTH]; 54 vsnprintf(buffer, sizeof(buffer), format, args); 55 os_log_with_type(g_logger, log_type, "%{public}s", buffer); 56 } 57 } 58 59 DNBCallbackLog OsLogger::GetLogFunction() { return DarwinLogCallback; } 60 61 #else 62 63 DNBCallbackLog OsLogger::GetLogFunction() { return nullptr; } 64 65 #endif 66 67