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