Go to the documentation of this file.
9 #ifndef LLDB_UTILITY_LOG_H
10 #define LLDB_UTILITY_LOG_H
15 #include "llvm/ADT/ArrayRef.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/StringMap.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Support/Error.h"
20 #include "llvm/Support/FormatVariadic.h"
21 #include "llvm/Support/ManagedStatic.h"
22 #include "llvm/Support/RWMutex.h"
30 #include <type_traits>
36 #define LLDB_LOG_OPTION_VERBOSE (1u << 1)
37 #define LLDB_LOG_OPTION_PREPEND_SEQUENCE (1u << 3)
38 #define LLDB_LOG_OPTION_PREPEND_TIMESTAMP (1u << 4)
39 #define LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD (1u << 5)
40 #define LLDB_LOG_OPTION_PREPEND_THREAD_NAME (1U << 6)
41 #define LLDB_LOG_OPTION_BACKTRACE (1U << 7)
42 #define LLDB_LOG_OPTION_APPEND (1U << 8)
43 #define LLDB_LOG_OPTION_PREPEND_FILE_FUNCTION (1U << 9)
53 virtual bool isA(
const void *ClassID)
const {
return ClassID == &
ID; }
68 bool isA(
const void *ClassID)
const override {
return ClassID == &
ID; }
83 bool isA(
const void *ClassID)
const override {
return ClassID == &
ID; }
97 void Dump(llvm::raw_ostream &stream)
const;
99 bool isA(
const void *ClassID)
const override {
return ClassID == &
ID; }
126 template <MaskType Bit>
135 template <
typename Cat>
140 std::is_same<
Log::MaskType, std::underlying_type_t<Cat>>::value);
154 template <
typename Cat>
160 std::is_same<
Log::MaskType, std::underlying_type_t<Cat>>::value);
168 Log *log =
log_ptr.load(std::memory_order_relaxed);
169 if (log && ((log->
GetMask() & mask) != 0))
177 static void Register(llvm::StringRef name, Channel &channel);
182 uint32_t log_options, llvm::StringRef channel,
183 llvm::ArrayRef<const char *> categories,
184 llvm::raw_ostream &error_stream);
187 llvm::ArrayRef<const char *> categories,
188 llvm::raw_ostream &error_stream);
191 llvm::raw_ostream &output_stream,
192 llvm::raw_ostream &error_stream);
195 llvm::raw_ostream &stream);
202 llvm::StringRef channel,
203 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> lambda);
220 template <
typename...
Args>
221 void Format(llvm::StringRef file, llvm::StringRef
function,
222 const char *format,
Args &&... args) {
223 Format(file,
function, llvm::formatv(format, std::forward<Args>(args)...));
226 template <
typename...
Args>
228 llvm::StringRef
function,
const char *format,
232 std::forward<Args>(args)...));
250 void VAPrintf(const
char *format, va_list args);
251 void VAError(const
char *format, va_list args);
266 void WriteHeader(llvm::raw_ostream &OS, llvm::StringRef file,
267 llvm::StringRef
function);
270 void Format(llvm::StringRef file, llvm::StringRef
function,
271 const llvm::formatv_object_base &payload);
274 llvm::sys::ScopedReader lock(
m_mutex);
278 void Enable(
const std::shared_ptr<LogHandler> &handler_sp,
uint32_t options,
283 bool Dump(llvm::raw_ostream &stream);
289 const Log::ChannelMap::value_type &entry,
290 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> lambda);
293 const ChannelMap::value_type &entry);
295 const ChannelMap::value_type &entry,
296 llvm::ArrayRef<const char *> categories);
298 Log(
const Log &) =
delete;
311 std::is_same<
Log::MaskType, std::underlying_type_t<Cat>>::value);
337 #define LLDB_LOG(log, ...) \
339 ::lldb_private::Log *log_private = (log); \
341 log_private->Format(__FILE__, __func__, __VA_ARGS__); \
344 #define LLDB_LOGF(log, ...) \
346 ::lldb_private::Log *log_private = (log); \
348 log_private->Printf(__VA_ARGS__); \
351 #define LLDB_LOGV(log, ...) \
353 ::lldb_private::Log *log_private = (log); \
354 if (log_private && log_private->GetVerbose()) \
355 log_private->Format(__FILE__, __func__, __VA_ARGS__); \
360 #define LLDB_LOG_ERROR(log, error, ...) \
362 ::lldb_private::Log *log_private = (log); \
363 ::llvm::Error error_private = (error); \
364 if (log_private && error_private) { \
365 log_private->FormatError(::std::move(error_private), __FILE__, __func__, \
368 ::llvm::consumeError(::std::move(error_private)); \
371 #endif // LLDB_UTILITY_LOG_H
const char * toString(AppleArm64ExceptionClass EC)
void VAError(const char *format, va_list args)
size_t NormalizeIndex(size_t i) const
static Log::MaskType GetFlags(llvm::raw_ostream &stream, const ChannelMap::value_type &entry, llvm::ArrayRef< const char * > categories)
void PutString(llvm::StringRef str)
std::atomic< uint32_t > m_options
llvm::StringMap< Log > ChannelMap
void VAPrintf(const char *format, va_list args)
void(* LogOutputCallback)(const char *, void *baton)
static void Register(llvm::StringRef name, Channel &channel)
__attribute__((always_inline)) int uuid_is_null(uuid_t uuid)
static bool classof(const LogHandler *obj)
Log * GetLog(MaskType mask)
std::atomic< MaskType > m_mask
void void void void Warning(const char *fmt,...) __attribute__((format(printf
static bool DisableLogChannel(llvm::StringRef channel, llvm::ArrayRef< const char * > categories, llvm::raw_ostream &error_stream)
static bool classof(const LogHandler *obj)
static bool classof(const LogHandler *obj)
static void ForEachChannelCategory(llvm::StringRef channel, llvm::function_ref< void(llvm::StringRef, llvm::StringRef)> lambda)
Calls the given lambda for every category in the given channel.
~StreamLogHandler() override
static void ForEachCategory(const Log::ChannelMap::value_type &entry, llvm::function_ref< void(llvm::StringRef, llvm::StringRef)> lambda)
bool isA(const void *ClassID) const override
void Emit(llvm::StringRef message) override
StreamLogHandler(int fd, bool should_close, size_t buffer_size=0)
void Printf(const char *format,...) __attribute__((format(printf
Prefer using LLDB_LOGF whenever possible.
static llvm::raw_ostream & error(Stream &strm)
static bool classof(const LogHandler *obj)
void Enable(const std::shared_ptr< LogHandler > &handler_sp, uint32_t options, MaskType flags)
static bool ListChannelCategories(llvm::StringRef channel, llvm::raw_ostream &stream)
static void ListAllLogChannels(llvm::raw_ostream &stream)
void Format(llvm::StringRef file, llvm::StringRef function, const char *format, Args &&... args)
std::shared_ptr< LogHandler > m_handler
constexpr Category(llvm::StringLiteral name, llvm::StringLiteral description, Cat mask)
static void DisableAllLogChannels()
Log::Channel & LogChannelFor()=delete
llvm::StringLiteral description
llvm::raw_fd_ostream m_stream
void Disable(MaskType flags)
const MaskType default_flags
virtual bool isA(const void *ClassID) const
void FormatError(llvm::Error error, llvm::StringRef file, llvm::StringRef function, const char *format, Args &&... args)
static void Unregister(llvm::StringRef name)
static constexpr MaskType ChannelFlag
const llvm::ArrayRef< Category > categories
string(SUBSTRING ${p} 10 -1 pStripped) if($
bool Dump(llvm::raw_ostream &stream)
void WriteHeader(llvm::raw_ostream &OS, llvm::StringRef file, llvm::StringRef function)
uint64_t MaskType
The underlying type of all log channel enums.
void Emit(llvm::StringRef message) override
CallbackLogHandler(lldb::LogOutputCallback callback, void *baton)
bool isA(const void *ClassID) const override
message(FATAL_ERROR "invalid libipt include path provided") endif() include_directories($
void void void Verbose(const char *fmt,...) __attribute__((format(printf
static llvm::ManagedStatic< ChannelMap > g_channel_map
llvm::sys::RWMutex m_mutex
constexpr Channel(llvm::ArrayRef< Log::Category > categories, Cat default_flags)
std::unique_ptr< std::string[]> m_messages
virtual void Emit(llvm::StringRef message)=0
RotatingLogHandler(size_t size)
size_t GetNumMessages() const
std::shared_ptr< LogHandler > GetHandler()
void WriteMessage(const std::string &message)
static bool EnableLogChannel(const std::shared_ptr< LogHandler > &log_handler_sp, uint32_t log_options, llvm::StringRef channel, llvm::ArrayRef< const char * > categories, llvm::raw_ostream &error_stream)
size_t GetFirstMessageIndex() const
void Emit(llvm::StringRef message) override
A class that represents a running process on the host machine.
void operator=(const Log &)=delete
void void void void const Flags GetOptions() const
void Dump(llvm::raw_ostream &stream) const
std::atomic< Log * > log_ptr
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
lldb::LogOutputCallback m_callback
static void ListCategories(llvm::raw_ostream &stream, const ChannelMap::value_type &entry)
static bool DumpLogChannel(llvm::StringRef channel, llvm::raw_ostream &output_stream, llvm::raw_ostream &error_stream)
virtual ~LogHandler()=default
static std::vector< llvm::StringRef > ListChannels()
Returns the list of log channels.
bool isA(const void *ClassID) const override
void PutCString(const char *cstr)