1 //===-- LLDBServerUtilities.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 "LLDBServerUtilities.h"
11 
12 #include "lldb/Core/Log.h"
13 #include "lldb/Core/StreamFile.h"
14 #include "lldb/Core/StreamString.h"
15 #include "lldb/Interpreter/Args.h"
16 
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/StringRef.h"
19 
20 using namespace lldb;
21 using namespace lldb_private::lldb_server;
22 using namespace llvm;
23 
24 bool
25 LLDBServerUtilities::SetupLogging(const std::string& log_file,
26 	                              const StringRef& log_channels,
27 	                              uint32_t log_options)
28 {
29     lldb::StreamSP log_stream_sp;
30     if (log_file.empty())
31     {
32         log_stream_sp.reset(new StreamFile(stdout, false));
33     }
34     else
35     {
36         uint32_t options = File::eOpenOptionWrite | File::eOpenOptionCanCreate |
37                            File::eOpenOptionCloseOnExec | File::eOpenOptionAppend;
38         if (!(log_options & LLDB_LOG_OPTION_APPEND))
39             options |= File::eOpenOptionTruncate;
40 
41         log_stream_sp.reset(new StreamFile(log_file.c_str(), options));
42     }
43 
44     SmallVector<StringRef, 32> channel_array;
45     log_channels.split(channel_array, ":", /*MaxSplit*/ -1, /*KeepEmpty*/ false);
46     for (auto channel_with_categories : channel_array)
47     {
48         StreamString error_stream;
49         Args channel_then_categories(channel_with_categories);
50         std::string channel(channel_then_categories.GetArgumentAtIndex(0));
51         channel_then_categories.Shift (); // Shift off the channel
52 
53         bool success = Log::EnableLogChannel(log_stream_sp,
54                                              log_options,
55                                              channel.c_str(),
56                                              channel_then_categories.GetConstArgumentVector(),
57                                              error_stream);
58         if (!success)
59         {
60             fprintf(stderr, "Unable to open log file '%s' for channel \"%s\"\n",
61                     log_file.c_str(),
62                     channel_with_categories.str().c_str());
63             return false;
64         }
65     }
66     return true;
67 }
68