lldb-log.cpp revision 926060e198137f8a64face70455324a8cd4362a5
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- lldb-log.cpp --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
19ce6fe885c2e30f5ac6e0c787cb571a01f9d41f85Eli Friedman#include <string.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic Log *
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogAccessor (bool get, StreamSP *stream_sp_ptr)
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static Log* g_log = NULL; // Leak for now as auto_ptr was being cleaned up
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // by global constructors before other threads
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // were done with it.
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!get)
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (g_log)
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            delete g_log;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (stream_sp_ptr)
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            g_log = new Log (*stream_sp_ptr);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            g_log = NULL;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return g_log;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogMask ()
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = LogAccessor (true, NULL);
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
50f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return log->GetMask().Get();
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::IsLogVerbose ()
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t mask = GetLogMask();
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (mask & LIBLLDB_LOG_VERBOSE);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog *
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogIfAllCategoriesSet (uint32_t mask)
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = LogAccessor (true, NULL);
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log && mask)
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
67f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        uint32_t log_mask = log->GetMask().Get();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if ((log_mask & mask) != mask)
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return NULL;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return log;
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::LogIfAllCategoriesSet (uint32_t mask, const char *format, ...)
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = GetLogIfAllCategoriesSet (mask);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_list args;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_start (args, format);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->VAPrintf (format, args);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_end (args);
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::LogIfAnyCategoriesSet (uint32_t mask, const char *format, ...)
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = GetLogIfAnyCategoriesSet (mask);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_list args;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_start (args, format);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->VAPrintf (format, args);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_end (args);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog *
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogIfAnyCategoriesSet (uint32_t mask)
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = LogAccessor (true, NULL);
104f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (log && mask && (mask & log->GetMask().Get()))
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return log;
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
110926060e198137f8a64face70455324a8cd4362a5Caroline Ticelldb_private::DisableLog (Args &args, Stream *feedback_strm)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
112926060e198137f8a64face70455324a8cd4362a5Caroline Tice    Log *log = LogAccessor (true, NULL);
113926060e198137f8a64face70455324a8cd4362a5Caroline Tice    uint32_t flag_bits;
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115926060e198137f8a64face70455324a8cd4362a5Caroline Tice    if (log)
116926060e198137f8a64face70455324a8cd4362a5Caroline Tice    {
117926060e198137f8a64face70455324a8cd4362a5Caroline Tice        flag_bits = log->GetMask().Get();
118926060e198137f8a64face70455324a8cd4362a5Caroline Tice        const size_t argc = args.GetArgumentCount ();
119926060e198137f8a64face70455324a8cd4362a5Caroline Tice        for (size_t i = 0; i < argc; ++i)
120926060e198137f8a64face70455324a8cd4362a5Caroline Tice        {
121926060e198137f8a64face70455324a8cd4362a5Caroline Tice            const char *arg = args.GetArgumentAtIndex (i);
122926060e198137f8a64face70455324a8cd4362a5Caroline Tice
123926060e198137f8a64face70455324a8cd4362a5Caroline Tice            if      (strcasecmp(arg, "all")     == 0  ) flag_bits &= ~LIBLLDB_LOG_ALL;
124926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "api")     == 0)   flag_bits &= ~LIBLLDB_LOG_API;
125926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "break")   == arg) flag_bits &= ~LIBLLDB_LOG_BREAKPOINTS;
126926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "default") == 0  ) flag_bits &= ~LIBLLDB_LOG_DEFAULT;
127926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "event")   == arg) flag_bits &= ~LIBLLDB_LOG_EVENTS;
128926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "expr")    == arg) flag_bits &= ~LIBLLDB_LOG_EXPRESSIONS;
129926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "object")  == arg) flag_bits &= ~LIBLLDB_LOG_OBJECT;
130926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "process") == 0  ) flag_bits &= ~LIBLLDB_LOG_PROCESS;
131926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "shlib")   == 0  ) flag_bits &= ~LIBLLDB_LOG_SHLIB;
132926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "state")   == 0  ) flag_bits &= ~LIBLLDB_LOG_STATE;
133926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "step")    == 0  ) flag_bits &= ~LIBLLDB_LOG_STEP;
134926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "thread")  == 0  ) flag_bits &= ~LIBLLDB_LOG_THREAD;
135926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasecmp(arg, "verbose") == 0  ) flag_bits &= ~LIBLLDB_LOG_VERBOSE;
136926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "watch")   == arg) flag_bits &= ~LIBLLDB_LOG_WATCHPOINTS;
137926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "temp")   == arg)  flag_bits &= ~LIBLLDB_LOG_TEMPORARY;
138926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "comm")   == arg)  flag_bits &= ~LIBLLDB_LOG_COMMUNICATION;
139926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "conn")   == arg)  flag_bits &= ~LIBLLDB_LOG_CONNECTION;
140926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "host")   == arg)  flag_bits &= ~LIBLLDB_LOG_HOST;
141926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (strcasestr(arg, "unwind") == arg)  flag_bits &= ~LIBLLDB_LOG_UNWIND;
142926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else
143926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
144926060e198137f8a64face70455324a8cd4362a5Caroline Tice                feedback_strm->Printf ("error:  unrecognized log category '%s'\n", arg);
145926060e198137f8a64face70455324a8cd4362a5Caroline Tice                ListLogCategories (feedback_strm);
146926060e198137f8a64face70455324a8cd4362a5Caroline Tice                return;
147926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
148926060e198137f8a64face70455324a8cd4362a5Caroline Tice
149926060e198137f8a64face70455324a8cd4362a5Caroline Tice        }
150926060e198137f8a64face70455324a8cd4362a5Caroline Tice        if (flag_bits == 0)
151926060e198137f8a64face70455324a8cd4362a5Caroline Tice            LogAccessor (false, NULL);
152926060e198137f8a64face70455324a8cd4362a5Caroline Tice        else
153926060e198137f8a64face70455324a8cd4362a5Caroline Tice            log->GetMask().Reset (flag_bits);
154926060e198137f8a64face70455324a8cd4362a5Caroline Tice    }
155926060e198137f8a64face70455324a8cd4362a5Caroline Tice
156926060e198137f8a64face70455324a8cd4362a5Caroline Tice    return;
157926060e198137f8a64face70455324a8cd4362a5Caroline Tice}
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog *
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args &args, Stream *feedback_strm)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Try see if there already is a log - that way we can reuse its settings.
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We could reuse the log in toto, but we don't know that the stream is the same.
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t flag_bits;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log* log = LogAccessor (true, NULL);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
167f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        flag_bits = log->GetMask().Get();
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flag_bits = 0;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Now make a new log with this stream.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    log = LogAccessor (false, &log_stream_sp);
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool got_unknown_category = false;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i=0; i<argc; ++i)
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *arg = args.GetArgumentAtIndex(i);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if      (strcasecmp(arg, "all")     == 0  ) flag_bits |= LIBLLDB_LOG_ALL;
1827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice            else if (strcasecmp(arg, "api")     == 0)   flag_bits |= LIBLLDB_LOG_API;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "break")   == arg) flag_bits |= LIBLLDB_LOG_BREAKPOINTS;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "default") == 0  ) flag_bits |= LIBLLDB_LOG_DEFAULT;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "event")   == arg) flag_bits |= LIBLLDB_LOG_EVENTS;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "expr")    == arg) flag_bits |= LIBLLDB_LOG_EXPRESSIONS;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "object")  == arg) flag_bits |= LIBLLDB_LOG_OBJECT;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "process") == 0  ) flag_bits |= LIBLLDB_LOG_PROCESS;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "shlib")   == 0  ) flag_bits |= LIBLLDB_LOG_SHLIB;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "state")   == 0  ) flag_bits |= LIBLLDB_LOG_STATE;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "step")    == 0  ) flag_bits |= LIBLLDB_LOG_STEP;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "thread")  == 0  ) flag_bits |= LIBLLDB_LOG_THREAD;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(arg, "verbose") == 0  ) flag_bits |= LIBLLDB_LOG_VERBOSE;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "watch")   == arg) flag_bits |= LIBLLDB_LOG_WATCHPOINTS;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "temp")   == arg)  flag_bits |= LIBLLDB_LOG_TEMPORARY;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "comm")   == arg)  flag_bits |= LIBLLDB_LOG_COMMUNICATION;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasestr(arg, "conn")   == arg)  flag_bits |= LIBLLDB_LOG_CONNECTION;
198b0fff359652c7b3c0eb6fb6c37995e61e6cc652dJim Ingham            else if (strcasestr(arg, "host")   == arg)  flag_bits |= LIBLLDB_LOG_HOST;
1998280cbe80c79bc206335831dd732e0f9fb69c519Jason Molenda            else if (strcasestr(arg, "unwind") == arg)  flag_bits |= LIBLLDB_LOG_UNWIND;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (got_unknown_category == false)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    got_unknown_category = true;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ListLogCategories (feedback_strm);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return log;
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        log->GetMask().Reset(flag_bits);
213f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        log->GetOptions().Reset(log_options);
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return log;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::ListLogCategories (Stream *strm)
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm->Printf("Logging categories for 'lldb':\n"
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tall - turn on all available logging categories\n"
2247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        "\tapi - enable logging of API calls and return values\n"
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tdefault - enable the default set of logging categories for liblldb\n"
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tbreak - log breakpoints\n"
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tevents - log broadcaster, listener and event queue activities\n"
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\texpr - log expressions\n"
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tobject - log object construction/destruction for important objects\n"
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tprocess - log process events and activities\n"
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tthread - log thread events and activities\n"
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tshlib - log shared library related activities\n"
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tstate - log private and public process state changes\n"
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tstep - log step related activities\n"
2358280cbe80c79bc206335831dd732e0f9fb69c519Jason Molenda        "\tunwind - log stack unwind activities\n"
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\tverbose - enable verbose loggging\n"
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        "\twatch - log watchpoint related activities\n");
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
239