summaryrefslogtreecommitdiffstats
path: root/lldb/tools/debugserver/source
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/debugserver/source')
-rw-r--r--lldb/tools/debugserver/source/CMakeLists.txt6
-rw-r--r--lldb/tools/debugserver/source/DNB.cpp7
-rw-r--r--lldb/tools/debugserver/source/DNB.h3
-rw-r--r--lldb/tools/debugserver/source/DNBDefs.h1
-rw-r--r--lldb/tools/debugserver/source/JSON.cpp746
-rw-r--r--lldb/tools/debugserver/source/JSON.h382
-rw-r--r--lldb/tools/debugserver/source/MacOSX/CMakeLists.txt3
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.cpp18
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.h36
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStreamSPI.h200
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/CMakeLists.txt15
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp835
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.h139
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogEvent.h27
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogInterfaces.h25
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogTypes.h23
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.cpp14
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h44
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.cpp61
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.h48
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.cpp57
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.h36
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.cpp118
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.h58
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.cpp19
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h53
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.cpp95
-rw-r--r--lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.h73
-rw-r--r--lldb/tools/debugserver/source/MacOSX/OsLogger.cpp71
-rw-r--r--lldb/tools/debugserver/source/MacOSX/OsLogger.h24
-rw-r--r--lldb/tools/debugserver/source/RNBContext.cpp2
-rw-r--r--lldb/tools/debugserver/source/RNBContext.h20
-rw-r--r--lldb/tools/debugserver/source/RNBRemote.cpp267
-rw-r--r--lldb/tools/debugserver/source/RNBRemote.h6
-rw-r--r--lldb/tools/debugserver/source/debugserver.cpp24
35 files changed, 29 insertions, 3527 deletions
diff --git a/lldb/tools/debugserver/source/CMakeLists.txt b/lldb/tools/debugserver/source/CMakeLists.txt
index b309d99a555..94cef6c3120 100644
--- a/lldb/tools/debugserver/source/CMakeLists.txt
+++ b/lldb/tools/debugserver/source/CMakeLists.txt
@@ -1,6 +1,5 @@
include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
include_directories(${LLDB_SOURCE_DIR}/source)
-include_directories(MacOSX/DarwinLog)
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
include_directories(MacOSX)
@@ -43,11 +42,6 @@ add_library(lldbDebugserverCommon
DNBLog.cpp
DNBRegisterInfo.cpp
DNBThreadResumeActions.cpp
- JSON.cpp
- # JSON reader depends on the following LLDB-common files
- ${LLDB_SOURCE_DIR}/source/Host/common/StringConvert.cpp
- ${LLDB_SOURCE_DIR}/source/Utility/StringExtractor.cpp
- # end JSON reader dependencies
libdebugserver.cpp
PseudoTerminal.cpp
PThreadEvent.cpp
diff --git a/lldb/tools/debugserver/source/DNB.cpp b/lldb/tools/debugserver/source/DNB.cpp
index fc36dcec078..bb360364919 100644
--- a/lldb/tools/debugserver/source/DNB.cpp
+++ b/lldb/tools/debugserver/source/DNB.cpp
@@ -41,7 +41,6 @@
#endif
#endif
-#include "MacOSX/DarwinLog/DarwinLogCollector.h"
#include "MacOSX/MachProcess.h"
#include "MacOSX/MachTask.h"
#include "MacOSX/Genealogy.h"
@@ -1869,12 +1868,6 @@ DNBProcessGetAvailableProfileData (nub_process_t pid, char *buf, nub_size_t buf_
return 0;
}
-DarwinLogEventVector
-DNBProcessGetAvailableDarwinLogEvents(nub_process_t pid)
-{
- return DarwinLogCollector::GetEventsForProcess(pid);
-}
-
nub_size_t
DNBProcessGetStopCount (nub_process_t pid)
{
diff --git a/lldb/tools/debugserver/source/DNB.h b/lldb/tools/debugserver/source/DNB.h
index 3e928e663d7..fbaf5e34813 100644
--- a/lldb/tools/debugserver/source/DNB.h
+++ b/lldb/tools/debugserver/source/DNB.h
@@ -14,7 +14,6 @@
#ifndef __DNB_h__
#define __DNB_h__
-#include "MacOSX/DarwinLog/DarwinLogEvent.h"
#include "MacOSX/Genealogy.h"
#include "MacOSX/ThreadInfo.h"
#include "JSONGenerator.h"
@@ -82,8 +81,6 @@ nub_bool_t DNBProcessMemoryDeallocate (nub_process_t pid, nub_addr_t addr)
int DNBProcessMemoryRegionInfo (nub_process_t pid, nub_addr_t addr, DNBRegionInfo *region_info) DNB_EXPORT;
std::string DNBProcessGetProfileData (nub_process_t pid, DNBProfileDataScanType scanType) DNB_EXPORT;
nub_bool_t DNBProcessSetEnableAsyncProfiling (nub_process_t pid, nub_bool_t enable, uint64_t interval_usec, DNBProfileDataScanType scan_type) DNB_EXPORT;
-DarwinLogEventVector DNBProcessGetAvailableDarwinLogEvents(nub_process_t pid);
-
//----------------------------------------------------------------------
// Process status
diff --git a/lldb/tools/debugserver/source/DNBDefs.h b/lldb/tools/debugserver/source/DNBDefs.h
index 36efad22417..e3757e903e5 100644
--- a/lldb/tools/debugserver/source/DNBDefs.h
+++ b/lldb/tools/debugserver/source/DNBDefs.h
@@ -142,7 +142,6 @@ enum
#define LOG_WATCHPOINTS (1u << 11)
#define LOG_STEP (1u << 12)
#define LOG_TASK (1u << 13)
-#define LOG_DARWIN_LOG (1u << 14)
#define LOG_LO_USER (1u << 16)
#define LOG_HI_USER (1u << 31)
#define LOG_ALL 0xFFFFFFFFu
diff --git a/lldb/tools/debugserver/source/JSON.cpp b/lldb/tools/debugserver/source/JSON.cpp
deleted file mode 100644
index e7e0423e9e8..00000000000
--- a/lldb/tools/debugserver/source/JSON.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-//===--------------------- JSON.cpp -----------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "JSON.h"
-
-// C includes
-#include <assert.h>
-#include <limits.h>
-
-// C++ includes
-#include <iomanip>
-#include <sstream>
-#include "lldb/Host/StringConvert.h"
-
-using namespace lldb_private;
-
-std::string
-JSONString::json_string_quote_metachars (const std::string &s)
-{
- if (s.find('"') == std::string::npos)
- return s;
-
- std::string output;
- const size_t s_size = s.size();
- const char *s_chars = s.c_str();
- for (size_t i = 0; i < s_size; i++)
- {
- unsigned char ch = *(s_chars + i);
- if (ch == '"')
- {
- output.push_back ('\\');
- }
- output.push_back (ch);
- }
- return output;
-}
-
-JSONString::JSONString () :
- JSONValue(JSONValue::Kind::String),
- m_data()
-{
-}
-
-JSONString::JSONString (const char* s) :
- JSONValue(JSONValue::Kind::String),
- m_data(s ? s : "")
-{
-}
-
-JSONString::JSONString (const std::string& s) :
- JSONValue(JSONValue::Kind::String),
- m_data(s)
-{
-}
-
-void
-JSONString::Write (std::ostream& s)
-{
- s << "\"" << json_string_quote_metachars(m_data).c_str() <<"\"";
-}
-
-uint64_t
-JSONNumber::GetAsUnsigned() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return m_data.m_unsigned;
- case DataType::Signed:
- return (uint64_t)m_data.m_signed;
- case DataType::Double:
- return (uint64_t)m_data.m_double;
- }
- assert("Unhandled data type");
-}
-
-int64_t
-JSONNumber::GetAsSigned() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return (int64_t)m_data.m_unsigned;
- case DataType::Signed:
- return m_data.m_signed;
- case DataType::Double:
- return (int64_t)m_data.m_double;
- }
- assert("Unhandled data type");
-}
-
-double
-JSONNumber::GetAsDouble() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return (double)m_data.m_unsigned;
- case DataType::Signed:
- return (double)m_data.m_signed;
- case DataType::Double:
- return m_data.m_double;
- }
- assert("Unhandled data type");
-}
-
-void
-JSONNumber::Write (std::ostream& s)
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- s << m_data.m_unsigned;
- break;
- case DataType::Signed:
- s << m_data.m_signed;
- break;
- case DataType::Double:
- // Set max precision to emulate %g.
- s << std::setprecision(std::numeric_limits<double>::digits10 + 1);
- s << m_data.m_double;
- break;
- }
-}
-
-JSONTrue::JSONTrue () :
- JSONValue(JSONValue::Kind::True)
-{
-}
-
-void
-JSONTrue::Write(std::ostream& s)
-{
- s << "true";
-}
-
-JSONFalse::JSONFalse () :
- JSONValue(JSONValue::Kind::False)
-{
-}
-
-void
-JSONFalse::Write(std::ostream& s)
-{
- s << "false";
-}
-
-JSONNull::JSONNull () :
- JSONValue(JSONValue::Kind::Null)
-{
-}
-
-void
-JSONNull::Write(std::ostream& s)
-{
- s << "null";
-}
-
-JSONObject::JSONObject () :
- JSONValue(JSONValue::Kind::Object)
-{
-}
-
-void
-JSONObject::Write (std::ostream& s)
-{
- bool first = true;
- s << '{';
- auto iter = m_elements.begin(), end = m_elements.end();
- for (;iter != end; iter++)
- {
- if (first)
- first = false;
- else
- s << ',';
- JSONString key(iter->first);
- JSONValue::SP value(iter->second);
- key.Write(s);
- s << ':';
- value->Write(s);
- }
- s << '}';
-}
-
-bool
-JSONObject::SetObject (const std::string& key,
- JSONValue::SP value)
-{
- if (key.empty() || nullptr == value.get())
- return false;
- m_elements[key] = value;
- return true;
-}
-
-JSONValue::SP
-JSONObject::GetObject (const std::string& key) const
-{
- auto iter = m_elements.find(key), end = m_elements.end();
- if (iter == end)
- return JSONValue::SP();
- return iter->second;
-}
-
-bool
-JSONObject::GetObjectAsBool (const std::string& key, bool& value) const
-{
- auto value_sp = GetObject(key);
- if (!value_sp)
- {
- // The given key doesn't exist, so we have no value.
- return false;
- }
-
- if (JSONTrue::classof(value_sp.get()))
- {
- // We have the value, and it is true.
- value = true;
- return true;
- }
- else if (JSONFalse::classof(value_sp.get()))
- {
- // We have the value, and it is false.
- value = false;
- return true;
- }
- else
- {
- // We don't have a valid bool value for the given key.
- return false;
- }
-}
-
-bool
-JSONObject::GetObjectAsString (const std::string& key, std::string& value) const
-{
- auto value_sp = GetObject(key);
- if (!value_sp)
- {
- // The given key doesn't exist, so we have no value.
- return false;
- }
-
- if (!JSONString::classof(value_sp.get()))
- return false;
-
- value = static_cast<JSONString*>(value_sp.get())->GetData();
- return true;
-}
-
-JSONArray::JSONArray () :
- JSONValue(JSONValue::Kind::Array)
-{
-}
-
-void
-JSONArray::Write (std::ostream& s)
-{
- bool first = true;
- s << '[';
- auto iter = m_elements.begin(), end = m_elements.end();
- for (;iter != end; iter++)
- {
- if (first)
- first = false;
- else
- s << ',';
- (*iter)->Write(s);
- }
- s << ']';
-}
-
-bool
-JSONArray::SetObject (Index i,
- JSONValue::SP value)
-{
- if (value.get() == nullptr)
- return false;
- if (i < m_elements.size())
- {
- m_elements[i] = value;
- return true;
- }
- if (i == m_elements.size())
- {
- m_elements.push_back(value);
- return true;
- }
- return false;
-}
-
-bool
-JSONArray::AppendObject (JSONValue::SP value)
-{
- if (value.get() == nullptr)
- return false;
- m_elements.push_back(value);
- return true;
-}
-
-JSONValue::SP
-JSONArray::GetObject (Index i)
-{
- if (i < m_elements.size())
- return m_elements[i];
- return JSONValue::SP();
-}
-
-JSONArray::Size
-JSONArray::GetNumElements ()
-{
- return m_elements.size();
-}
-
-
-JSONParser::JSONParser (const char *cstr) :
- StringExtractor(cstr)
-{
-}
-
-JSONParser::Token
-JSONParser::GetToken (std::string &value)
-{
- std::ostringstream error;
-
- value.clear();
- SkipSpaces ();
- const uint64_t start_index = m_index;
- const char ch = GetChar();
- switch (ch)
- {
- case '{': return Token::ObjectStart;
- case '}': return Token::ObjectEnd;
- case '[': return Token::ArrayStart;
- case ']': return Token::ArrayEnd;
- case ',': return Token::Comma;
- case ':': return Token::Colon;
- case '\0': return Token::EndOfFile;
- case 't':
- if (GetChar() == 'r')
- if (GetChar() == 'u')
- if (GetChar() == 'e')
- return Token::True;
- break;
-
- case 'f':
- if (GetChar() == 'a')
- if (GetChar() == 'l')
- if (GetChar() == 's')
- if (GetChar() == 'e')
- return Token::False;
- break;
-
- case 'n':
- if (GetChar() == 'u')
- if (GetChar() == 'l')
- if (GetChar() == 'l')
- return Token::Null;
- break;
-
- case '"':
- {
- while (1)
- {
- bool was_escaped = false;
- int escaped_ch = GetEscapedChar(was_escaped);
- if (escaped_ch == -1)
- {
- error << "error: an error occurred getting a character from offset " <<start_index;
- value = std::move(error.str());
- return Token::Error;
-
- }
- else
- {
- const bool is_end_quote = escaped_ch == '"';
- const bool is_null = escaped_ch == 0;
- if (was_escaped || (!is_end_quote && !is_null))
- {
- if (CHAR_MIN <= escaped_ch && escaped_ch <= CHAR_MAX)
- {
- value.append(1, (char)escaped_ch);
- }
- else
- {
- error << "error: wide character support is needed for unicode character 0x" << std::setprecision(4) << std::hex << escaped_ch;
- error << " at offset " << start_index;
- value = std::move(error.str());
- return Token::Error;
- }
- }
- else if (is_end_quote)
- {
- return Token::String;
- }
- else if (is_null)
- {
- value = "error: missing end quote for string";
- return Token::Error;
- }
- }
- }
- }
- break;
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- bool done = false;
- bool got_decimal_point = false;
- uint64_t exp_index = 0;
- bool got_int_digits = (ch >= '0') && (ch <= '9');
- bool got_frac_digits = false;
- bool got_exp_digits = false;
- while (!done)
- {
- const char next_ch = PeekChar();
- switch (next_ch)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (exp_index != 0)
- {
- got_exp_digits = true;
- }
- else if (got_decimal_point)
- {
- got_frac_digits = true;
- }
- else
- {
- got_int_digits = true;
- }
- ++m_index; // Skip this character
- break;
-
- case '.':
- if (got_decimal_point)
- {
- error << "error: extra decimal point found at offset " << start_index;
- value = std::move(error.str());
- return Token::Error;
- }
- else
- {
- got_decimal_point = true;
- ++m_index; // Skip this character
- }
- break;
-
- case 'e':
- case 'E':
- if (exp_index != 0)
- {
- error << "error: extra exponent character found at offset " << start_index;
- value = std::move(error.str());
- return Token::Error;
- }
- else
- {
- exp_index = m_index;
- ++m_index; // Skip this character
- }
- break;
-
- case '+':
- case '-':
- // The '+' and '-' can only come after an exponent character...
- if (exp_index == m_index - 1)
- {
- ++m_index; // Skip the exponent sign character
- }
- else
- {
- error << "error: unexpected " << next_ch << " character at offset " << start_index;
- value = std::move(error.str());
- return Token::Error;
- }
- break;
-
- default:
- done = true;
- break;
- }
- }
-
- if (m_index > start_index)
- {
- value = m_packet.substr(start_index, m_index - start_index);
- if (got_decimal_point)
- {
- if (exp_index != 0)
- {
- // We have an exponent, make sure we got exponent digits
- if (got_exp_digits)
- {
- return Token::Float;
- }
- else
- {
- error << "error: got exponent character but no exponent digits at offset in float value \"" << value.c_str() << "\"";
- value = std::move(error.str());
- return Token::Error;
- }
- }
- else
- {
- // No exponent, but we need at least one decimal after the decimal point
- if (got_frac_digits)
- {
- return Token::Float;
- }
- else
- {
- error << "error: no digits after decimal point \"" << value.c_str() << "\"";
- value = std::move(error.str());
- return Token::Error;
- }
- }
- }
- else
- {
- // No decimal point
- if (got_int_digits)
- {
- // We need at least some integer digits to make an integer
- return Token::Integer;
- }
- else
- {
- error << "error: no digits negate sign \"" << value.c_str() << "\"";
- value = std::move(error.str());
- return Token::Error;
- }
- }
- }
- else
- {
- error << "error: invalid number found at offset " << start_index;
- value = std::move(error.str());
- return Token::Error;
- }
- }
- break;
- default:
- break;
- }
- error << "error: failed to parse token at offset " << start_index << " (around character '" << ch << "')";
- value = std::move(error.str());
- return Token::Error;
-}
-
-int
-JSONParser::GetEscapedChar(bool &was_escaped)
-{
- was_escaped = false;
- const char ch = GetChar();
- if (ch == '\\')
- {
- was_escaped = true;
- const char ch2 = GetChar();
- switch (ch2)
- {
- case '"':
- case '\\':
- case '/':
- default:
- break;
-
- case 'b': return '\b';
- case 'f': return '\f';
- case 'n': return '\n';
- case 'r': return '\r';
- case 't': return '\t';
- case 'u':
- {
- const int hi_byte = DecodeHexU8();
- const int lo_byte = DecodeHexU8();
- if (hi_byte >=0 && lo_byte >= 0)
- return hi_byte << 8 | lo_byte;
- return -1;
- }
- break;
- }
- return ch2;
- }
- return ch;
-}
-
-JSONValue::SP
-JSONParser::ParseJSONObject ()
-{
- // The "JSONParser::Token::ObjectStart" token should have already been consumed
- // by the time this function is called
- std::unique_ptr<JSONObject> dict_up(new JSONObject());
-
- std::string value;
- std::string key;
- while (1)
- {
- JSONParser::Token token = GetToken(value);
-
- if (token == JSONParser::Token::String)
- {
- key.swap(value);
- token = GetToken(value);
- if (token == JSONParser::Token::Colon)
- {
- JSONValue::SP value_sp = ParseJSONValue();
- if (value_sp)
- dict_up->SetObject(key, value_sp);
- else
- break;
- }
- }
- else if (token == JSONParser::Token::ObjectEnd)
- {
- return JSONValue::SP(dict_up.release());
- }
- else if (token == JSONParser::Token::Comma)
- {
- continue;
- }
- else
- {
- break;
- }
- }
- return JSONValue::SP();
-}
-
-JSONValue::SP
-JSONParser::ParseJSONArray ()
-{
- // The "JSONParser::Token::ObjectStart" token should have already been consumed
- // by the time this function is called
- std::unique_ptr<JSONArray> array_up(new JSONArray());
-
- std::string value;
- std::string key;
- while (1)
- {
- JSONValue::SP value_sp = ParseJSONValue();
- if (value_sp)
- array_up->AppendObject(value_sp);
- else
- break;
-
- JSONParser::Token token = GetToken(value);
- if (token == JSONParser::Token::Comma)
- {
- continue;
- }
- else if (token == JSONParser::Token::ArrayEnd)
- {
- return JSONValue::SP(array_up.release());
- }
- else
- {
- break;
- }
- }
- return JSONValue::SP();
-}
-
-JSONValue::SP
-JSONParser::ParseJSONValue ()
-{
- std::string value;
- const JSONParser::Token token = GetToken(value);
- switch (token)
- {
- case JSONParser::Token::ObjectStart:
- return ParseJSONObject();
-
- case JSONParser::Token::ArrayStart:
- return ParseJSONArray();
-
- case JSONParser::Token::Integer:
- {
- if (value.front() == '-')
- {
- bool success = false;
- int64_t sval = StringConvert::ToSInt64(value.c_str(), 0, 0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(sval));
- }
- else
- {
- bool success = false;
- uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(uval));
- }
- }
- break;
-
- case JSONParser::Token::Float:
- {
- bool success = false;
- double val = StringConvert::ToDouble(value.c_str(), 0.0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(val));
- }
- break;
-
- case JSONParser::Token::String:
- return JSONValue::SP(new JSONString(value));
-
- case JSONParser::Token::True:
- return JSONValue::SP(new JSONTrue());
-
- case JSONParser::Token::False:
- return JSONValue::SP(new JSONFalse());
-
- case JSONParser::Token::Null:
- return JSONValue::SP(new JSONNull());
-
- default:
- break;
- }
- return JSONValue::SP();
-
-}
diff --git a/lldb/tools/debugserver/source/JSON.h b/lldb/tools/debugserver/source/JSON.h
deleted file mode 100644
index d1723d87a38..00000000000
--- a/lldb/tools/debugserver/source/JSON.h
+++ /dev/null
@@ -1,382 +0,0 @@
-//===---------------------JSON.h --------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef utility_JSON_h_
-#define utility_JSON_h_
-
-// This cross-project usage is fine as StringExtractor.h is entirely
-// self-contained.
-#include "lldb/Utility/StringExtractor.h"
-
-// C includes
-#include <inttypes.h>
-#include <stdint.h>
-
-// C++ includes
-#include <map>
-#include <memory>
-#include <ostream>
-#include <string>
-#include <vector>
-
-class JSONValue
-{
-public:
- virtual void
- Write (std::ostream& s) = 0;
-
- typedef std::shared_ptr<JSONValue> SP;
-
- enum class Kind
- {
- String,
- Number,
- True,
- False,
- Null,
- Object,
- Array
- };
-
- JSONValue (Kind k) :
- m_kind(k)
- {}
-
- Kind
- GetKind() const
- {
- return m_kind;
- }
-
- virtual
- ~JSONValue () = default;
-
-private:
- const Kind m_kind;
-};
-
-class JSONString : public JSONValue
-{
-public:
- JSONString ();
- JSONString (const char* s);
- JSONString (const std::string& s);
-
- JSONString (const JSONString& s) = delete;
- JSONString&
- operator = (const JSONString& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONString> SP;
-
- std::string
- GetData () { return m_data; }
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::String;
- }
-
- ~JSONString() override = default;
-
-private:
-
- static std::string
- json_string_quote_metachars (const std::string&);
-
- std::string m_data;
-};
-
-class JSONNumber : public JSONValue
-{
-public:
- typedef std::shared_ptr<JSONNumber> SP;
-
- // We cretae a constructor for all integer and floating point type with using templates and
- // SFINAE to avoid having ambiguous overloads because of the implicit type promotion. If we
- // would have constructors only with int64_t, uint64_t and double types then constructing a
- // JSONNumber from an int32_t (or any other similar type) would fail to compile.
-
- template <typename T,
- typename std::enable_if<std::is_integral<T>::value &&
- std::is_unsigned<T>::value>::type* = nullptr>
- explicit JSONNumber (T u) :
- JSONValue(JSONValue::Kind::Number),
- m_data_type(DataType::Unsigned)
- {
- m_data.m_unsigned = u;
- }
-
- template <typename T,
- typename std::enable_if<std::is_integral<T>::value &&
- std::is_signed<T>::value>::type* = nullptr>
- explicit JSONNumber (T s) :
- JSONValue(JSONValue::Kind::Number),
- m_data_type(DataType::Signed)
- {
- m_data.m_signed = s;
- }
-
- template <typename T,
- typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
- explicit JSONNumber (T d) :
- JSONValue(JSONValue::Kind::Number),
- m_data_type(DataType::Double)
- {
- m_data.m_double = d;
- }
-
- ~JSONNumber() override = default;
-
- JSONNumber (const JSONNumber& s) = delete;
- JSONNumber&
- operator = (const JSONNumber& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- uint64_t
- GetAsUnsigned() const;
-
- int64_t
- GetAsSigned() const;
-
- double
- GetAsDouble() const;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::Number;
- }
-
-private:
- enum class DataType : uint8_t
- {
- Unsigned,
- Signed,
- Double
- } m_data_type;
-
- union
- {
- uint64_t m_unsigned;
- int64_t m_signed;
- double m_double;
- } m_data;
-};
-
-class JSONTrue : public JSONValue
-{
-public:
- JSONTrue ();
-
- JSONTrue (const JSONTrue& s) = delete;
- JSONTrue&
- operator = (const JSONTrue& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONTrue> SP;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::True;
- }
-
- ~JSONTrue() override = default;
-};
-
-class JSONFalse : public JSONValue
-{
-public:
- JSONFalse ();
-
- JSONFalse (const JSONFalse& s) = delete;
- JSONFalse&
- operator = (const JSONFalse& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONFalse> SP;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::False;
- }
-
- ~JSONFalse() override = default;
-};
-
-class JSONNull : public JSONValue
-{
-public:
- JSONNull ();
-
- JSONNull (const JSONNull& s) = delete;
- JSONNull&
- operator = (const JSONNull& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONNull> SP;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::Null;
- }
-
- ~JSONNull() override = default;
-};
-
-class JSONObject : public JSONValue
-{
-public:
- JSONObject ();
-
- JSONObject (const JSONObject& s) = delete;
- JSONObject&
- operator = (const JSONObject& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONObject> SP;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::Object;
- }
-
- bool
- SetObject (const std::string& key,
- JSONValue::SP value);
-
- JSONValue::SP
- GetObject (const std::string& key) const;
-
- // -------------------------------------------------------------------------
- /// Return keyed value as bool
- ///
- /// @param[in] key
- /// The value of the key to lookup
- ///
- /// @param[out] value
- /// The value of the key as a bool. Undefined if the key doesn't
- /// exist or if the key is not either true or false.
- ///
- /// @return
- /// true if the key existed as was a bool value; false otherwise.
- /// Note the return value is *not* the value of the bool, use
- /// \b value for that.
- // -------------------------------------------------------------------------
- bool
- GetObjectAsBool (const std::string& key, bool& value) const;
-
- bool
- GetObjectAsString (const std::string& key, std::string& value) const;
-
- ~JSONObject() override = default;
-
-private:
- typedef std::map<std::string, JSONValue::SP> Map;
- typedef Map::iterator Iterator;
- Map m_elements;
-};
-
-class JSONArray : public JSONValue
-{
-public:
- JSONArray ();
-
- JSONArray (const JSONArray& s) = delete;
- JSONArray&
- operator = (const JSONArray& s) = delete;
-
- void
- Write(std::ostream& s) override;
-
- typedef std::shared_ptr<JSONArray> SP;
-
- static bool classof(const JSONValue *V)
- {
- return V->GetKind() == JSONValue::Kind::Array;
- }
-
-private:
- typedef std::vector<JSONValue::SP> Vector;
- typedef Vector::iterator Iterator;
- typedef Vector::size_type Index;
- typedef Vector::size_type Size;
-
-public:
- bool
- SetObject (Index i,
- JSONValue::SP value);
-
- bool
- AppendObject (JSONValue::SP value);
-
- JSONValue::SP
- GetObject (Index i);
-
- Size
- GetNumElements ();
-
- ~JSONArray() override = default;
-
- Vector m_elements;
-};
-
-class JSONParser : public StringExtractor
-{
-public:
- enum Token
- {
- Invalid,
- Error,
- ObjectStart,
- ObjectEnd,
- ArrayStart,
- ArrayEnd,
- Comma,
- Colon,
- String,
- Integer,
- Float,
- True,
- False,
- Null,
- EndOfFile
- };
-
- JSONParser (const char *cstr);
-
- int
- GetEscapedChar (bool &was_escaped);
-
- Token
- GetToken (std::string &value);
-
- JSONValue::SP
- ParseJSONValue ();
-
-protected:
- JSONValue::SP
- ParseJSONObject ();
-
- JSONValue::SP
- ParseJSONArray ();
-};
-
-#endif // utility_JSON_h_
diff --git a/lldb/tools/debugserver/source/MacOSX/CMakeLists.txt b/lldb/tools/debugserver/source/MacOSX/CMakeLists.txt
index 49b0931ee59..a154dcc485a 100644
--- a/lldb/tools/debugserver/source/MacOSX/CMakeLists.txt
+++ b/lldb/tools/debugserver/source/MacOSX/CMakeLists.txt
@@ -3,7 +3,6 @@
add_subdirectory(i386)
#add_subdirectory(ppc)
add_subdirectory(x86_64)
-add_subdirectory(DarwinLog)
include_directories(..)
@@ -33,7 +32,6 @@ set(DEBUGSERVER_USED_LIBS
lldbUtility
lldbDebugserverMacOSX_I386
lldbDebugserverMacOSX_X86_64
- lldbDebugserverMacOSX_DarwinLog
)
add_lldb_executable(debugserver
@@ -48,7 +46,6 @@ add_lldb_executable(debugserver
MachThreadList.cpp
MachVMMemory.cpp
MachVMRegion.cpp
- OsLogger.cpp
${generated_mach_interfaces}
${DEBUGSERVER_VERS_GENERATED_FILE}
)
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.cpp
deleted file mode 100644
index e98a131512a..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-//===-- ActivityStore.cpp ---------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "ActivityStore.h"
-
-ActivityStore::ActivityStore()
-{
-}
-
-ActivityStore::~ActivityStore()
-{
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.h
deleted file mode 100644
index 2e998ba367c..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//===-- ActivityStore.h -----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef ActivityStore_h
-#define ActivityStore_h
-
-#include <string>
-
-#include "ActivityStreamSPI.h"
-
-class ActivityStore
-{
-public:
-
- virtual
- ~ActivityStore();
-
- virtual const char*
- GetActivityForID(os_activity_id_t activity_id) const = 0;
-
- virtual std::string
- GetActivityChainForID(os_activity_id_t activity_id) const = 0;
-
-protected:
-
- ActivityStore();
-
-};
-
-#endif /* ActivityStore_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStreamSPI.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStreamSPI.h
deleted file mode 100644
index 4ddf13b3fcd..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/ActivityStreamSPI.h
+++ /dev/null
@@ -1,200 +0,0 @@
-//===-- ActivityStreamAPI.h -------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef ActivityStreamSPI_h
-#define ActivityStreamSPI_h
-
-#include <sys/time.h>
-#include <xpc/xpc.h>
-
-#define OS_ACTIVITY_MAX_CALLSTACK 32
-
-// Enums
-
-enum
-{
- OS_ACTIVITY_STREAM_PROCESS_ONLY = 0x00000001,
- OS_ACTIVITY_STREAM_SKIP_DECODE = 0x00000002,
- OS_ACTIVITY_STREAM_PAYLOAD = 0x00000004,
- OS_ACTIVITY_STREAM_HISTORICAL = 0x00000008,
- OS_ACTIVITY_STREAM_CALLSTACK = 0x00000010,
- OS_ACTIVITY_STREAM_DEBUG = 0x00000020,
- OS_ACTIVITY_STREAM_BUFFERED = 0x00000040,
- OS_ACTIVITY_STREAM_NO_SENSITIVE = 0x00000080,
- OS_ACTIVITY_STREAM_INFO = 0x00000100,
- OS_ACTIVITY_STREAM_PROMISCUOUS = 0x00000200,
- OS_ACTIVITY_STREAM_PRECISE_TIMESTAMPS = 0x00000200
-};
-typedef uint32_t os_activity_stream_flag_t;
-
-enum
-{
- OS_ACTIVITY_STREAM_TYPE_ACTIVITY_CREATE = 0x0201,
- OS_ACTIVITY_STREAM_TYPE_ACTIVITY_TRANSITION = 0x0202,
- OS_ACTIVITY_STREAM_TYPE_ACTIVITY_USERACTION = 0x0203,
-
- OS_ACTIVITY_STREAM_TYPE_TRACE_MESSAGE = 0x0300,
-
- OS_ACTIVITY_STREAM_TYPE_LOG_MESSAGE = 0x0400,
- OS_ACTIVITY_STREAM_TYPE_LEGACY_LOG_MESSAGE = 0x0480,
-
- OS_ACTIVITY_STREAM_TYPE_SIGNPOST_BEGIN = 0x0601,
- OS_ACTIVITY_STREAM_TYPE_SIGNPOST_END = 0x0602,
- OS_ACTIVITY_STREAM_TYPE_SIGNPOST_EVENT = 0x0603,
-
- OS_ACTIVITY_STREAM_TYPE_STATEDUMP_EVENT = 0x0A00,
-};
-typedef uint32_t os_activity_stream_type_t;
-
-enum
-{
- OS_ACTIVITY_STREAM_EVENT_STARTED = 1,
- OS_ACTIVITY_STREAM_EVENT_STOPPED = 2,
- OS_ACTIVITY_STREAM_EVENT_FAILED = 3,
- OS_ACTIVITY_STREAM_EVENT_CHUNK_STARTED = 4,
- OS_ACTIVITY_STREAM_EVENT_CHUNK_FINISHED = 5,
-};
-typedef uint32_t os_activity_stream_event_t;
-
-// Types
-
-typedef uint64_t os_activity_id_t;
-typedef struct os_activity_stream_s *os_activity_stream_t;
-typedef struct os_activity_stream_entry_s *os_activity_stream_entry_t;
-
-#define OS_ACTIVITY_STREAM_COMMON() \
- uint64_t trace_id; \
- uint64_t timestamp; \
- uint64_t thread; \
- const uint8_t *image_uuid; \
- const char *image_path; \
- struct timeval tv_gmt; \
- struct timezone tz; \
- uint32_t offset \
-
-
-typedef struct os_activity_stream_common_s {
- OS_ACTIVITY_STREAM_COMMON();
-} *os_activity_stream_common_t;
-
-struct os_activity_create_s {
- OS_ACTIVITY_STREAM_COMMON();
- const char *name;
- os_activity_id_t creator_aid;
- uint64_t unique_pid;
-};
-
-struct os_activity_transition_s {
- OS_ACTIVITY_STREAM_COMMON();
- os_activity_id_t transition_id;
-};
-
-typedef struct os_log_message_s {
- OS_ACTIVITY_STREAM_COMMON();
- const char *format;
- const uint8_t *buffer;
- size_t buffer_sz;
- const uint8_t *privdata;
- size_t privdata_sz;
- const char *subsystem;
- const char *category;
- uint32_t oversize_id;
- uint8_t ttl;
- bool persisted;
-} *os_log_message_t;
-
-typedef struct os_trace_message_v2_s {
- OS_ACTIVITY_STREAM_COMMON();
- const char *format;
- const void *buffer;
- size_t bufferLen;
- xpc_object_t __unsafe_unretained payload;
-} *os_trace_message_v2_t;
-
-typedef struct os_activity_useraction_s {
- OS_ACTIVITY_STREAM_COMMON();
- const char *action;
- bool persisted;
-} *os_activity_useraction_t;
-
-typedef struct os_signpost_s {
- OS_ACTIVITY_STREAM_COMMON();
- const char *format;
- const uint8_t *buffer;
- size_t buffer_sz;
- const uint8_t *privdata;
- size_t privdata_sz;
- const char *subsystem;
- const char *category;
- uint64_t duration_nsec;
- uint32_t callstack_depth;
- uint64_t callstack[OS_ACTIVITY_MAX_CALLSTACK];
-} *os_signpost_t;
-
-typedef struct os_activity_statedump_s {
- OS_ACTIVITY_STREAM_COMMON();
- char *message;
- size_t message_size;
- char image_path_buffer[PATH_MAX];
-} *os_activity_statedump_t;
-
-struct os_activity_stream_entry_s {
- os_activity_stream_type_t type;
-
- // information about the process streaming the data
- pid_t pid;
- uint64_t proc_id;
- const uint8_t *proc_imageuuid;
- const char *proc_imagepath;
-
- // the activity associated with this streamed event
- os_activity_id_t activity_id;
- os_activity_id_t parent_id;
-
- union {
- struct os_activity_stream_common_s common;
- struct os_activity_create_s activity_create;
- struct os_activity_transition_s activity_transition;
- struct os_log_message_s log_message;
- struct os_trace_message_v2_s trace_message;
- struct os_activity_useraction_s useraction;
- struct os_signpost_s signpost;
- struct os_activity_statedump_s statedump;
- };
-};
-
-// Blocks
-
-typedef bool (^os_activity_stream_block_t)(os_activity_stream_entry_t entry,
- int error);
-
-typedef void (^os_activity_stream_event_block_t)(
- os_activity_stream_t stream,
- os_activity_stream_event_t event);
-
-// SPI entry point prototypes
-
-typedef os_activity_stream_t
- (*os_activity_stream_for_pid_t)(pid_t pid, os_activity_stream_flag_t flags,
- os_activity_stream_block_t stream_block);
-
-typedef void
-(*os_activity_stream_resume_t)(os_activity_stream_t stream);
-
-typedef void
- (*os_activity_stream_cancel_t)(os_activity_stream_t stream);
-
-typedef char *
- (*os_log_copy_formatted_message_t)(os_log_message_t log_message);
-
-typedef void
- (*os_activity_stream_set_event_handler_t)
- (os_activity_stream_t stream, os_activity_stream_event_block_t block);
-
-#endif /* ActivityStreamSPI_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/CMakeLists.txt b/lldb/tools/debugserver/source/MacOSX/DarwinLog/CMakeLists.txt
deleted file mode 100644
index 47e7362f0d5..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# Due to sources including headers like:
-# #include "MacOSX/i386/DNBArchImplI386.h"
-# we must include the grandparent directory...
-include_directories(${LLDB_SOURCE_DIR}/tools/debugserver/source)
-
-add_library(lldbDebugserverMacOSX_DarwinLog
- ActivityStore.cpp
- DarwinLogCollector.cpp
- LogFilter.cpp
- LogFilterChain.cpp
- LogFilterExactMatch.cpp
- LogFilterRegex.cpp
- LogMessage.cpp
- LogMessageOsLog.cpp
- )
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp
deleted file mode 100644
index 30f3e521669..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp
+++ /dev/null
@@ -1,835 +0,0 @@
-//===-- DarwinLogCollector.cpp ----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "DarwinLogCollector.h"
-#include "ActivityStreamSPI.h"
-
-#include <dlfcn.h>
-
-#include <cinttypes>
-#include <mutex>
-#include <vector>
-
-#include "DarwinLogTypes.h"
-#include "DNB.h"
-#include "DNBLog.h"
-#include "LogFilterChain.h"
-#include "LogFilterExactMatch.h"
-#include "LogFilterRegex.h"
-#include "LogMessageOsLog.h"
-#include "MachProcess.h"
-#include "RNBContext.h"
-#include "RNBDefs.h"
-#include "RNBRemote.h"
-
-// Use an anonymous namespace for variables and methods that have no
-// reason to leak out through the interface.
-namespace
-{
- /// Specify max depth that the activity parent-child chain will search
- /// back to get the full activity chain name. If we do more than this,
- /// we assume either we hit a loop or it's just too long.
- static const size_t MAX_ACTIVITY_CHAIN_DEPTH = 10;
-
- // Used to tap into and retrieve logs from target process.
- // (Consumer of os_log).
- static os_activity_stream_for_pid_t s_os_activity_stream_for_pid;
- static os_activity_stream_resume_t s_os_activity_stream_resume;
- static os_activity_stream_cancel_t s_os_activity_stream_cancel;
- static os_log_copy_formatted_message_t s_os_log_copy_formatted_message;
- static os_activity_stream_set_event_handler_t
- s_os_activity_stream_set_event_handler;
-
- bool
- LookupSPICalls()
- {
- static std::once_flag s_once_flag;
- static bool s_has_spi;
-
- std::call_once(s_once_flag, [] {
- s_os_activity_stream_for_pid = (os_activity_stream_for_pid_t)
- dlsym(RTLD_DEFAULT, "os_activity_stream_for_pid");
- s_os_activity_stream_resume = (os_activity_stream_resume_t)
- dlsym(RTLD_DEFAULT, "os_activity_stream_resume");
- s_os_activity_stream_cancel = (os_activity_stream_cancel_t)
- dlsym(RTLD_DEFAULT, "os_activity_stream_cancel");
- s_os_log_copy_formatted_message = (os_log_copy_formatted_message_t)
- dlsym(RTLD_DEFAULT, "os_log_copy_formatted_message");
- s_os_activity_stream_set_event_handler =
- (os_activity_stream_set_event_handler_t)
- dlsym(RTLD_DEFAULT, "os_activity_stream_set_event_handler");
-
- // We'll indicate we're all set if every function entry point
- // was found.
- s_has_spi =
- (s_os_activity_stream_for_pid != nullptr) &&
- (s_os_activity_stream_resume != nullptr) &&
- (s_os_activity_stream_cancel != nullptr) &&
- (s_os_log_copy_formatted_message != nullptr) &&
- (s_os_activity_stream_set_event_handler != nullptr);
- if (s_has_spi)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "Found os_log SPI calls.");
- // Tell LogMessageOsLog how to format messages when search
- // criteria requires it.
- LogMessageOsLog::SetFormatterFunction(
- s_os_log_copy_formatted_message);
- }
- else
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "Failed to find os_log SPI "
- "calls.");
- }
- });
-
- return s_has_spi;
- }
-
- using Mutex = std::mutex;
- static Mutex s_collector_mutex;
- static std::vector<DarwinLogCollectorSP> s_collectors;
-
- static void
- TrackCollector(const DarwinLogCollectorSP &collector_sp)
- {
- std::lock_guard<Mutex> locker(s_collector_mutex);
- if (std::find(s_collectors.begin(), s_collectors.end(), collector_sp)
- != s_collectors.end())
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "attempted to add same collector multiple times");
- return;
- }
- s_collectors.push_back(collector_sp);
- }
-
- static void
- StopTrackingCollector(const DarwinLogCollectorSP &collector_sp)
- {
- std::lock_guard<Mutex> locker(s_collector_mutex);
- s_collectors.erase(std::remove(s_collectors.begin(), s_collectors.end(),
- collector_sp),
- s_collectors.end());
- }
-
- static DarwinLogCollectorSP
- FindCollectorForProcess(pid_t pid)
- {
- std::lock_guard<Mutex> locker(s_collector_mutex);
- for (const auto &collector_sp : s_collectors)
- {
- if (collector_sp && (collector_sp->GetProcessID() == pid))
- return collector_sp;
- }
- return DarwinLogCollectorSP();
- }
-
- static FilterTarget
- TargetStringToEnum(const std::string &filter_target_name)
- {
- if (filter_target_name == "activity")
- return eFilterTargetActivity;
- else if (filter_target_name == "activity-chain")
- return eFilterTargetActivityChain;
- else if (filter_target_name == "category")
- return eFilterTargetCategory;
- else if (filter_target_name == "message")
- return eFilterTargetMessage;
- else if (filter_target_name == "subsystem")
- return eFilterTargetSubsystem;
- else
- return eFilterTargetInvalid;
- }
-
- class Configuration
- {
- public:
-
- Configuration(const JSONObject &config) :
- m_is_valid(false),
- m_activity_stream_flags(OS_ACTIVITY_STREAM_PROCESS_ONLY),
- m_filter_chain_sp(nullptr)
- {
- // Parse out activity stream flags
- if (!ParseSourceFlags(config))
- {
- m_is_valid = false;
- return;
- }
-
- // Parse filter rules
- if (!ParseFilterRules(config))
- {
- m_is_valid = false;
- return;
- }
-
- // Everything worked.
- m_is_valid = true;
- }
-
- bool
- ParseSourceFlags(const JSONObject &config)
- {
- // Get the source-flags dictionary.
- auto source_flags_sp = config.GetObject("source-flags");
- if (!source_flags_sp)
- return false;
- if (!JSONObject::classof(source_flags_sp.get()))
- return false;
-
- const JSONObject &source_flags =
- *static_cast<JSONObject*>(source_flags_sp.get());
-
- // Parse out the flags.
- bool include_any_process = false;
- bool include_callstacks = false;
- bool include_info_level = false;
- bool include_debug_level = false;
- bool live_stream = false;
-
- if (!source_flags.GetObjectAsBool("any-process",
- include_any_process))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Source-flag 'any-process' missing from "
- "configuration.");
- return false;
- }
- if (!source_flags.GetObjectAsBool("callstacks",
- include_callstacks))
- {
- // We currently suppress the availability of this on the lldb
- // side. We include here for devices when we enable in the
- // future.
- // DNBLogThreadedIf(LOG_DARWIN_LOG,
- // "Source-flag 'callstacks' missing from "
- // "configuration.");
-
- // OK. We just skip callstacks.
- // return false;
- }
- if (!source_flags.GetObjectAsBool("info-level",
- include_info_level))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Source-flag 'info-level' missing from "
- "configuration.");
- return false;
- }
- if (!source_flags.GetObjectAsBool("debug-level",
- include_debug_level))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Source-flag 'debug-level' missing from "
- "configuration.");
- return false;
- }
- if (!source_flags.GetObjectAsBool("live-stream",
- live_stream))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Source-flag 'live-stream' missing from "
- "configuration.");
- return false;
- }
-
- // Setup the SPI flags based on this.
- m_activity_stream_flags = 0;
- if (!include_any_process)
- m_activity_stream_flags |= OS_ACTIVITY_STREAM_PROCESS_ONLY;
- if (include_callstacks)
- m_activity_stream_flags |= OS_ACTIVITY_STREAM_CALLSTACK;
- if (include_info_level)
- m_activity_stream_flags |= OS_ACTIVITY_STREAM_INFO;
- if (include_debug_level)
- m_activity_stream_flags |= OS_ACTIVITY_STREAM_DEBUG;
- if (!live_stream)
- m_activity_stream_flags |= OS_ACTIVITY_STREAM_BUFFERED;
-
- DNBLogThreadedIf(LOG_DARWIN_LOG, "m_activity_stream_flags = 0x%03x",
- m_activity_stream_flags);
-
- return true;
- }
-
- bool
- ParseFilterRules(const JSONObject &config)
- {
- // Retrieve the default rule.
- bool filter_default_accept = true;
- if (!config.GetObjectAsBool("filter-fall-through-accepts",
- filter_default_accept))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Setting 'filter-fall-through-accepts' "
- "missing from configuration.");
- return false;
- }
- m_filter_chain_sp.reset(new LogFilterChain(filter_default_accept));
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "DarwinLog no-match rule: %s.",
- filter_default_accept ? "accept" : "reject");
-
- // If we don't have the filter-rules array, we're done.
- auto filter_rules_sp = config.GetObject("filter-rules");
- if (!filter_rules_sp)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "No 'filter-rules' config element, all log "
- "entries will use the no-match action (%s).",
- filter_default_accept ? "accept" : "reject");
- return true;
- }
- if (!JSONArray::classof(filter_rules_sp.get()))
- return false;
- const JSONArray &rules_config =
- *static_cast<JSONArray*>(filter_rules_sp.get());
-
- // Create the filters.
- for (auto &rule_sp : rules_config.m_elements)
- {
- if (!JSONObject::classof(rule_sp.get()))
- return false;
- const JSONObject &rule_config = *static_cast<JSONObject*>
- (rule_sp.get());
-
- // Get whether this filter accepts or rejects.
- bool filter_accepts = true;
- if (!rule_config.GetObjectAsBool("accept", filter_accepts))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Filter 'accept' element missing.");
- return false;
- }
-
- // Grab the target log field attribute for the match.
- std::string target_attribute;
- if (!rule_config.GetObjectAsString("attribute",
- target_attribute))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Filter 'attribute' element missing.");
- return false;
- }
- auto target_enum = TargetStringToEnum(target_attribute);
- if (target_enum == eFilterTargetInvalid)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Filter attribute '%s' unsupported.",
- target_attribute.c_str());
- return false;
- }
-
- // Handle operation-specific fields and filter creation.
- std::string filter_type;
- if (!rule_config.GetObjectAsString("type", filter_type))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Filter 'type' element missing.");
- return false;
- }
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "Reading filter of type '%s'", filter_type
- .c_str());
-
- LogFilterSP filter_sp;
- if (filter_type == "regex")
- {
- // Grab the regex for the match.
- std::string regex;
- if (!rule_config.GetObjectAsString("regex",
- regex))
- {
- DNBLogError("Regex filter missing 'regex' element.");
- return false;
- }
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "regex for filter: \"%s\"", regex.c_str());
-
- // Create the regex filter.
- auto regex_filter =
- new LogFilterRegex(filter_accepts, target_enum, regex);
- filter_sp.reset(regex_filter);
-
- // Validate that the filter is okay.
- if (!regex_filter->IsValid())
- {
- DNBLogError("Invalid regex in filter: "
- "regex=\"%s\", error=%s",
- regex.c_str(),
- regex_filter->GetErrorAsCString());
- return false;
- }
- }
- else if (filter_type == "match")
- {
- // Grab the regex for the match.
- std::string exact_text;
- if (!rule_config.GetObjectAsString("exact_text",
- exact_text))
- {
- DNBLogError("Exact match filter missing "
- "'exact_text' element.");
- return false;
- }
-
- // Create the filter.
- filter_sp.reset(new LogFilterExactMatch(filter_accepts,
- target_enum,
- exact_text));
- }
-
- // Add the filter to the chain.
- m_filter_chain_sp->AppendFilter(filter_sp);
- }
- return true;
- }
-
- bool
- IsValid() const
- {
- return m_is_valid;
- }
-
- os_activity_stream_flag_t
- GetActivityStreamFlags() const
- {
- return m_activity_stream_flags;
- }
-
- const LogFilterChainSP &
- GetLogFilterChain() const
- {
- return m_filter_chain_sp;
- }
-
- private:
-
- bool m_is_valid;
- os_activity_stream_flag_t m_activity_stream_flags;
- LogFilterChainSP m_filter_chain_sp;
-
- };
-}
-
-bool
-DarwinLogCollector::IsSupported()
-{
- // We're supported if we have successfully looked up the SPI entry points.
- return LookupSPICalls();
-}
-
-bool
-DarwinLogCollector::StartCollectingForProcess(nub_process_t pid,
- const JSONObject &config)
-{
- // If we're currently collecting for this process, kill the existing
- // collector.
- if (CancelStreamForProcess(pid))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "%s() killed existing DarwinLog collector for pid %d.",
- __FUNCTION__, pid);
- }
-
- // If the process isn't alive, we're done.
- if (!DNBProcessIsAlive(pid))
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "%s() cannot collect for pid %d: process not alive.",
- __FUNCTION__, pid);
- return false;
- }
-
- // Validate the configuration.
- auto spi_config = Configuration(config);
- if (!spi_config.IsValid())
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG,
- "%s() invalid configuration, will not enable log "
- "collection", __FUNCTION__);
- return false;
- }
-
- // Create the stream collector that will manage collected data
- // for this pid.
- DarwinLogCollectorSP collector_sp(new DarwinLogCollector(pid,
- spi_config.GetLogFilterChain()));
- std::weak_ptr<DarwinLogCollector> collector_wp(collector_sp);
-
- // Setup the stream handling block.
- os_activity_stream_block_t block = ^bool (os_activity_stream_entry_t entry,
- int error) {
- // Check if our collector is still alive.
- DarwinLogCollectorSP inner_collector_sp = collector_wp.lock();
- if (!inner_collector_sp)
- return false;
- return inner_collector_sp->HandleStreamEntry(entry, error);
- };
-
- os_activity_stream_event_block_t stream_event_block =
- ^void (os_activity_stream_t stream, os_activity_stream_event_t event) {
- switch (event)
- {
- case OS_ACTIVITY_STREAM_EVENT_STARTED:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received stream event: "
- "OS_ACTIVITY_STREAM_EVENT_STARTED, stream %p.",
- (void*)stream);
- break;
- case OS_ACTIVITY_STREAM_EVENT_STOPPED:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received stream event: "
- "OS_ACTIVITY_STREAM_EVENT_STOPPED, stream %p.",
- (void*)stream);
- break;
- case OS_ACTIVITY_STREAM_EVENT_FAILED:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received stream event: "
- "OS_ACTIVITY_STREAM_EVENT_FAILED, stream %p.",
- (void*)stream);
- break;
- case OS_ACTIVITY_STREAM_EVENT_CHUNK_STARTED:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received stream event: "
- "OS_ACTIVITY_STREAM_EVENT_CHUNK_STARTED, stream %p.",
- (void*)stream);
- break;
- case OS_ACTIVITY_STREAM_EVENT_CHUNK_FINISHED:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received stream event: "
- "OS_ACTIVITY_STREAM_EVENT_CHUNK_FINISHED, stream %p.",
- (void*)stream);
- break;
- }
- };
-
- // Create the stream.
- os_activity_stream_t activity_stream =
- (*s_os_activity_stream_for_pid)(pid,
- spi_config.GetActivityStreamFlags(),
- block);
- collector_sp->SetActivityStream(activity_stream);
-
- // Specify the stream-related event handler.
- (*s_os_activity_stream_set_event_handler)(
- activity_stream, stream_event_block);
-
- // Start the stream.
- (*s_os_activity_stream_resume)(activity_stream);
-
- TrackCollector(collector_sp);
- return true;
-}
-
-DarwinLogEventVector
-DarwinLogCollector::GetEventsForProcess(nub_process_t pid)
-{
- auto collector_sp = FindCollectorForProcess(pid);
- if (!collector_sp)
- {
- // We're not tracking a stream for this process.
- return DarwinLogEventVector();
- }
-
- return collector_sp->RemoveEvents();
-}
-
-bool
-DarwinLogCollector::CancelStreamForProcess(nub_process_t pid)
-{
- auto collector_sp = FindCollectorForProcess(pid);
- if (!collector_sp)
- {
- // We're not tracking a stream for this process.
- return false;
- }
-
- collector_sp->CancelActivityStream();
- StopTrackingCollector(collector_sp);
-
- return true;
-}
-
-const char*
-DarwinLogCollector::GetActivityForID(os_activity_id_t activity_id) const
-{
- auto find_it = m_activity_map.find(activity_id);
- return (find_it != m_activity_map.end()) ?
- find_it->second.m_name.c_str() :
- nullptr;
-}
-
-/// Retrieve the full parent-child chain for activity names. These
-/// can be arbitrarily deep. This method assumes the caller has already
-/// locked the activity mutex.
-void
-DarwinLogCollector::GetActivityChainForID_internal(os_activity_id_t activity_id,
- std::string &result,
- size_t depth) const
-{
- if (depth > MAX_ACTIVITY_CHAIN_DEPTH)
- {
- // Terminating condition - too deeply nested.
- return;
- }
- else if (activity_id == 0)
- {
- // Terminating condition - no activity.
- return;
- }
-
- auto find_it = m_activity_map.find(activity_id);
- if (find_it == m_activity_map.end())
- {
- //Terminating condition - no data for activity_id.
- return;
- }
-
- // Activity name becomes parent activity name chain + ':' + our activity
- // name.
- GetActivityChainForID_internal(find_it->second.m_parent_id, result,
- depth + 1);
- if (!result.empty())
- result += ':';
- result += find_it->second.m_name;
-}
-
-std::string
-DarwinLogCollector::GetActivityChainForID(os_activity_id_t activity_id) const
-{
- std::string result;
- {
- std::lock_guard<std::mutex> locker(m_activity_info_mutex);
- GetActivityChainForID_internal(activity_id, result, 1);
- }
- return result;
-}
-
-DarwinLogCollector::DarwinLogCollector(nub_process_t pid,
- const LogFilterChainSP &filter_chain_sp):
- ActivityStore(),
- m_pid(pid),
- m_activity_stream(0),
- m_events(),
- m_events_mutex(),
- m_filter_chain_sp(filter_chain_sp),
- m_activity_info_mutex(),
- m_activity_map()
-{
-}
-
-DarwinLogCollector::~DarwinLogCollector()
-{
- // Cancel the stream.
- if (m_activity_stream)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "tearing down activity stream "
- "collector for %d", m_pid);
- (*s_os_activity_stream_cancel)(m_activity_stream);
- m_activity_stream = 0;
- }
- else
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "no stream to tear down for %d",
- m_pid);
- }
-}
-
-void
-DarwinLogCollector::SignalDataAvailable()
-{
- RNBRemoteSP remoteSP(g_remoteSP);
- if (!remoteSP)
- {
- // We're done. This is unexpected.
- StopTrackingCollector(shared_from_this());
- return;
- }
-
- RNBContext& ctx = remoteSP->Context();
- ctx.Events().SetEvents(RNBContext::event_darwin_log_data_available);
- // Wait for the main thread to consume this notification if it requested
- // we wait for it.
- ctx.Events().WaitForResetAck(RNBContext::event_darwin_log_data_available);
-}
-
-void
-DarwinLogCollector::SetActivityStream(os_activity_stream_t activity_stream)
-{
- m_activity_stream = activity_stream;
-}
-
-bool
-DarwinLogCollector::HandleStreamEntry(os_activity_stream_entry_t entry,
- int error)
-{
- if ((error == 0) && (entry != nullptr))
- {
- if (entry->pid != m_pid)
- {
- // For now, skip messages not originating from our process.
- // Later we might want to keep all messages related to an event
- // that we're tracking, even when it came from another process,
- // possibly doing work on our behalf.
- return true;
- }
-
- switch (entry->type)
- {
- case OS_ACTIVITY_STREAM_TYPE_ACTIVITY_CREATE:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received activity create: "
- "%s, creator aid %" PRIu64 ", unique_pid %" PRIu64
- "(activity id=%" PRIu64 ", parent id=%" PRIu64 ")",
- entry->activity_create.name,
- entry->activity_create.creator_aid,
- entry->activity_create.unique_pid, entry->activity_id,
- entry->parent_id
- );
- {
- std::lock_guard<std::mutex> locker(m_activity_info_mutex);
- m_activity_map.insert(std::make_pair(
- entry->activity_id,
- ActivityInfo(
- entry->activity_create.name,
- entry->activity_id,
- entry->parent_id)));
- }
- break;
-
- case OS_ACTIVITY_STREAM_TYPE_ACTIVITY_TRANSITION:
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received activity transition:"
- "new aid: %" PRIu64 "(activity id=%" PRIu64
- ", parent id=%" PRIu64 ", tid %" PRIu64 ")",
- entry->activity_transition.transition_id,
- entry->activity_id, entry->parent_id,
- entry->activity_transition.thread);
- break;
-
- case OS_ACTIVITY_STREAM_TYPE_LOG_MESSAGE:
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "received log message: "
- "(activity id=%" PRIu64 ", parent id=%" PRIu64 ", "
- "tid %" PRIu64 "): format %s",
- entry->activity_id, entry->parent_id,
- entry->log_message.thread,
- entry->log_message.format ? entry->log_message.format :
- "<invalid-format>");
-
- // Do the real work here.
- {
- // Ensure our process is still alive. If not, we can
- // cancel the collection.
- if (!DNBProcessIsAlive(m_pid))
- {
- // We're outta here. This is the manner in which we
- // stop collecting for a process.
- StopTrackingCollector(shared_from_this());
- return false;
- }
-
- LogMessageOsLog os_log_message(*this, *entry);
- if (!m_filter_chain_sp ||
- !m_filter_chain_sp->GetAcceptMessage(os_log_message))
- {
- // This log message was rejected by the filter,
- // so stop processing it now.
- return true;
- }
-
- // Copy over the relevant bits from the message.
- const struct os_log_message_s &log_message =
- entry->log_message;
-
- DarwinLogEventSP message_sp(new DarwinLogEvent());
- // Indicate this event is a log message event.
- message_sp->AddStringItem("type", "log");
-
- // Add the message contents (fully expanded).
- // Consider expanding on the remote side.
- // Then we don't pay for expansion until when it is
- // used.
- const char *message_text = os_log_message.GetMessage();
- if (message_text)
- message_sp->AddStringItem("message", message_text);
-
- // Add some useful data fields.
- message_sp->AddIntegerItem("timestamp",
- log_message.timestamp);
-
- // Do we want to do all activity name resolution on this
- // side? Maybe. For now, send IDs and ID->name mappings
- // and fix this up on that side. Later, when we add
- // debugserver-side filtering, we'll want to get the
- // activity names over here, so we should probably
- // just send them as resolved strings.
- message_sp->AddIntegerItem("activity_id",
- entry->activity_id);
- message_sp->AddIntegerItem("parent_id",
- entry->parent_id);
- message_sp->AddIntegerItem("thread_id",
- log_message.thread);
- if (log_message.subsystem && strlen(log_message.subsystem)
- > 0)
- message_sp->AddStringItem("subsystem",
- log_message.subsystem);
- if (log_message.category && strlen(log_message.category)
- > 0)
- message_sp->AddStringItem("category",
- log_message.category);
- if (entry->activity_id != 0)
- {
- std::string activity_chain =
- GetActivityChainForID(entry->activity_id);
- if (!activity_chain.empty())
- message_sp->AddStringItem("activity-chain",
- activity_chain);
- }
-
- // Add it to the list for later collection.
- {
- std::lock_guard<std::mutex> locker(m_events_mutex);
- m_events.push_back(message_sp);
- }
- SignalDataAvailable();
- }
- break;
- }
- }
- }
- else
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "HandleStreamEntry: final call, "
- "error %d", error);
- }
- return true;
-}
-
-DarwinLogEventVector
-DarwinLogCollector::RemoveEvents()
-{
- DarwinLogEventVector returned_events;
- {
- std::lock_guard<std::mutex> locker(m_events_mutex);
- returned_events.swap(m_events);
- }
- DNBLogThreadedIf(LOG_DARWIN_LOG, "DarwinLogCollector::%s(): removing %lu "
- "queued log entries", __FUNCTION__,
- returned_events.size());
- return returned_events;
-}
-
-void
-DarwinLogCollector::CancelActivityStream()
-{
- if (!m_activity_stream)
- return;
-
- DNBLogThreadedIf(LOG_DARWIN_LOG, "DarwinLogCollector::%s(): canceling "
- "activity stream %p", __FUNCTION__,
- m_activity_stream);
- (*s_os_activity_stream_cancel)(m_activity_stream);
- m_activity_stream = nullptr;
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.h
deleted file mode 100644
index 8263423fce1..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.h
+++ /dev/null
@@ -1,139 +0,0 @@
-//===-- DarwinLogCollector.h ------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DarwinLogCollector_h
-#define DarwinLogCollector_h
-
-#include <sys/types.h>
-
-#include <memory>
-#include <mutex>
-#include <unordered_map>
-
-#include "ActivityStore.h"
-#include "ActivityStreamSPI.h"
-#include "DarwinLogEvent.h"
-#include "DarwinLogInterfaces.h"
-#include "DNBDefs.h"
-#include "JSON.h"
-
-class DarwinLogCollector;
-typedef std::shared_ptr<DarwinLogCollector> DarwinLogCollectorSP;
-
-class DarwinLogCollector:
- public std::enable_shared_from_this<DarwinLogCollector>,
- public ActivityStore
-{
-public:
-
- //------------------------------------------------------------------
- /// Return whether the os_log and activity tracing SPI is available.
- ///
- /// @return \b true if the activity stream support is available,
- /// \b false otherwise.
- //------------------------------------------------------------------
- static bool
- IsSupported();
-
- //------------------------------------------------------------------
- /// Return a log function suitable for DNBLog to use as the internal
- /// logging function.
- ///
- /// @return a DNBLog-style logging function if IsSupported() returns
- /// true; otherwise, returns nullptr.
- //------------------------------------------------------------------
- static DNBCallbackLog
- GetLogFunction();
-
- static bool
- StartCollectingForProcess(nub_process_t pid, const JSONObject &config);
-
- static bool
- CancelStreamForProcess(nub_process_t pid);
-
- static DarwinLogEventVector
- GetEventsForProcess(nub_process_t pid);
-
- ~DarwinLogCollector();
-
- pid_t
- GetProcessID() const
- {
- return m_pid;
- }
-
- //------------------------------------------------------------------
- // ActivityStore API
- //------------------------------------------------------------------
- const char*
- GetActivityForID(os_activity_id_t activity_id) const override;
-
- std::string
- GetActivityChainForID(os_activity_id_t activity_id) const override;
-
-
-private:
-
- DarwinLogCollector() = delete;
- DarwinLogCollector(const DarwinLogCollector&) = delete;
- DarwinLogCollector &operator=(const DarwinLogCollector&) = delete;
-
- explicit
- DarwinLogCollector(nub_process_t pid,
- const LogFilterChainSP &filter_chain_sp);
-
- void
- SignalDataAvailable();
-
- void
- SetActivityStream(os_activity_stream_t activity_stream);
-
- bool
- HandleStreamEntry(os_activity_stream_entry_t entry, int error);
-
- DarwinLogEventVector
- RemoveEvents();
-
- void
- CancelActivityStream();
-
- void
- GetActivityChainForID_internal(os_activity_id_t activity_id,
- std::string &result, size_t depth) const;
-
- struct ActivityInfo
- {
- ActivityInfo(const char *name, os_activity_id_t activity_id,
- os_activity_id_t parent_activity_id) :
- m_name(name),
- m_id(activity_id),
- m_parent_id(parent_activity_id)
- {
- }
-
- const std::string m_name;
- const os_activity_id_t m_id;
- const os_activity_id_t m_parent_id;
- };
-
- using ActivityMap = std::unordered_map<os_activity_id_t, ActivityInfo>;
-
- const nub_process_t m_pid;
- os_activity_stream_t m_activity_stream;
- DarwinLogEventVector m_events;
- std::mutex m_events_mutex;
- LogFilterChainSP m_filter_chain_sp;
-
- /// Mutex to protect activity info (activity name and parent structures)
- mutable std::mutex m_activity_info_mutex;
- /// Map of activity id to ActivityInfo
- ActivityMap m_activity_map;
-};
-
-#endif /* LogStreamCollector_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogEvent.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogEvent.h
deleted file mode 100644
index 6be3b81f3e1..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogEvent.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//===-- DarwinLogEvent.h ----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DarwinLogEvent_h
-#define DarwinLogEvent_h
-
-#include <memory>
-#include <vector>
-
-#include "JSONGenerator.h"
-
-// =============================================================================
-/// Each discrete unit of information is described as an event, such as
-/// the emission of a single log message.
-// =============================================================================
-
-using DarwinLogEvent = JSONGenerator::Dictionary;
-using DarwinLogEventSP = std::shared_ptr<DarwinLogEvent>;
-using DarwinLogEventVector = std::vector<DarwinLogEventSP>;
-
-#endif
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogInterfaces.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogInterfaces.h
deleted file mode 100644
index afb979f6cfe..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogInterfaces.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//===-- DarwinLogInterfaces.h -----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DarwinLogInterfaces_h
-#define DarwinLogInterfaces_h
-
-#include <memory>
-
-class ActivityStore;
-
-class LogFilter;
-using LogFilterSP = std::shared_ptr<LogFilter>;
-
-class LogFilterChain;
-using LogFilterChainSP = std::shared_ptr<LogFilterChain>;
-
-class LogMessage;
-
-#endif /* DarwinLogInterfaces_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogTypes.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogTypes.h
deleted file mode 100644
index a090fba0c14..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogTypes.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//===-- DarwinLogTypes.h ----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DarwinLogTypes_h
-#define DarwinLogTypes_h
-
-enum FilterTarget
-{
- eFilterTargetInvalid,
- eFilterTargetActivity,
- eFilterTargetActivityChain,
- eFilterTargetCategory,
- eFilterTargetMessage,
- eFilterTargetSubsystem
-};
-
-#endif /* DarwinLogTypes_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.cpp
deleted file mode 100644
index 80af86ec505..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-//===-- LogFilter.cpp -------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LogFilter.h"
-
-LogFilter::~LogFilter()
-{
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h
deleted file mode 100644
index 4d54394cb32..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//===-- LogFilter.h ---------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LogFilter_h
-#define LogFilter_h
-
-#include "DarwinLogInterfaces.h"
-
-class LogFilter
-{
-public:
-
- virtual
- ~LogFilter();
-
- virtual bool
- DoesMatch(const LogMessage &message) const = 0;
-
- bool
- MatchesAreAccepted() const
- {
- return m_matches_accept;
- }
-
-protected:
-
- LogFilter(bool matches_accept) :
- m_matches_accept(matches_accept)
- {
- }
-
-private:
-
- bool m_matches_accept;
-
-};
-
-#endif /* LogFilter_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.cpp
deleted file mode 100644
index 888fbd9bfb1..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-//===-- LogFilterChain.cpp --------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LogFilterChain.h"
-
-#include "LogFilter.h"
-
-LogFilterChain::LogFilterChain(bool default_accept) :
- m_filters(),
- m_default_accept(default_accept)
-{
-}
-
-void
-LogFilterChain::AppendFilter(const LogFilterSP &filter_sp)
-{
- if (filter_sp)
- m_filters.push_back(filter_sp);
-}
-
-void
-LogFilterChain::ClearFilterChain()
-{
- m_filters.clear();
-}
-
-bool
-LogFilterChain::GetDefaultAccepts() const
-{
- return m_default_accept;
-}
-
-void
-LogFilterChain::SetDefaultAccepts(bool default_accept)
-{
- m_default_accept = default_accept;
-}
-
-bool
-LogFilterChain::GetAcceptMessage(const LogMessage &message) const
-{
- for (auto filter_sp : m_filters)
- {
- if (filter_sp->DoesMatch(message))
- {
- // This message matches this filter. If the filter accepts matches,
- // this message matches; otherwise, it rejects matches.
- return filter_sp->MatchesAreAccepted();
- }
- }
-
- // None of the filters matched. Therefore, we do whatever the
- // default fall-through rule says.
- return m_default_accept;
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.h
deleted file mode 100644
index 8774c15d98c..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterChain.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//===-- LogFilterChain.h ----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#ifndef LogFilterChain_h
-#define LogFilterChain_h
-
-#include <vector>
-
-#include "DarwinLogInterfaces.h"
-
-class LogFilterChain
-{
-public:
-
- LogFilterChain(bool default_accept);
-
- void
- AppendFilter(const LogFilterSP &filter_sp);
-
- void
- ClearFilterChain();
-
- bool
- GetDefaultAccepts() const;
-
- void
- SetDefaultAccepts(bool default_accepts);
-
- bool
- GetAcceptMessage(const LogMessage &message) const;
-
-private:
-
- using FilterVector = std::vector<LogFilterSP>;
-
- FilterVector m_filters;
- bool m_default_accept;
-
-};
-
-#endif /* LogFilterChain_hpp */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.cpp
deleted file mode 100644
index b85458618fd..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//===-- LogFilterExactMatch.cpp ---------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LogFilterExactMatch.h"
-#include "LogMessage.h"
-
-LogFilterExactMatch::LogFilterExactMatch(bool match_accepts,
- FilterTarget filter_target,
- const std::string &match_text) :
- LogFilter(match_accepts),
- m_filter_target(filter_target),
- m_match_text(match_text)
-{
-}
-
-bool
-LogFilterExactMatch::DoesMatch(const LogMessage &message) const
-{
- switch (m_filter_target)
- {
- case eFilterTargetActivity:
- // Empty fields never match a condition.
- if (!message.HasActivity())
- return false;
- return m_match_text == message.GetActivity();
- case eFilterTargetActivityChain:
- // Empty fields never match a condition.
- if (!message.HasActivity())
- return false;
- return m_match_text == message.GetActivityChain();
- case eFilterTargetCategory:
- // Empty fields never match a condition.
- if (!message.HasCategory())
- return false;
- return m_match_text == message.GetCategory();
- case eFilterTargetMessage:
- {
- const char *message_text = message.GetMessage();
- return (message_text != nullptr) &&
- (m_match_text == message_text);
- }
- case eFilterTargetSubsystem:
- // Empty fields never match a condition.
- if (!message.HasSubsystem())
- return false;
- return m_match_text == message.GetSubsystem();
- default:
- // We don't know this type.
- return false;
- }
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.h
deleted file mode 100644
index 131afaf234b..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterExactMatch.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//===-- LogFilterExactMatch.h -----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LogFilterExactMatch_h
-#define LogFilterExactMatch_h
-
-#include <string>
-
-#include "DarwinLogInterfaces.h"
-#include "DarwinLogTypes.h"
-#include "LogFilter.h"
-
-class LogFilterExactMatch : public LogFilter
-{
-public:
-
- LogFilterExactMatch(bool match_accepts, FilterTarget filter_target,
- const std::string &match_text);
-
- bool
- DoesMatch(const LogMessage &message) const override;
-
-private:
-
- const FilterTarget m_filter_target;
- const std::string m_match_text;
-
-};
-
-#endif
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.cpp
deleted file mode 100644
index 128c7514493..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-//===-- LogFilterRegex.cpp --------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#include "LogFilterRegex.h"
-
-#include "DNBLog.h"
-#include "LogMessage.h"
-
-//----------------------------------------------------------------------
-// Enable enhanced mode if it is available. This allows for things like
-// \d for digit, \s for space, and many more, but it isn't available
-// everywhere.
-//----------------------------------------------------------------------
-#if defined(REG_ENHANCED)
-#define DEFAULT_COMPILE_FLAGS (REG_ENHANCED|REG_EXTENDED)
-#else
-#define DEFAULT_COMPILE_FLAGS (REG_EXTENDED)
-#endif
-
-LogFilterRegex::LogFilterRegex(bool match_accepts,
- FilterTarget filter_target,
- const std::string &regex) :
- LogFilter(match_accepts),
- m_filter_target(filter_target),
- m_regex_text(regex),
- m_regex(),
- m_is_valid(false),
- m_error_text()
-{
- // Clear it.
- memset(&m_regex, 0, sizeof(m_regex));
-
- // Compile it.
- if (!regex.empty())
- {
- auto comp_err = ::regcomp(&m_regex, regex.c_str(),
- DEFAULT_COMPILE_FLAGS);
- m_is_valid = (comp_err == 0);
- if (!m_is_valid)
- {
- char buffer[256];
- buffer[0] = '\0';
- ::regerror(comp_err, &m_regex, buffer, sizeof(buffer));
- m_error_text = buffer;
- }
- }
-}
-
-LogFilterRegex::~LogFilterRegex()
-{
- if (m_is_valid)
- {
- // Free the regex internals.
- regfree(&m_regex);
- }
-}
-
-bool
-LogFilterRegex::DoesMatch(const LogMessage &message) const
-{
- switch (m_filter_target)
- {
- case eFilterTargetActivity:
- // Empty fields never match a condition.
- if (!message.HasActivity())
- return false;
- return ::regexec(&m_regex, message.GetActivity(), 0, nullptr, 0)
- == 0;
- case eFilterTargetActivityChain:
- // Empty fields never match a condition.
- if (!message.HasActivity())
- return false;
- return ::regexec(&m_regex, message.GetActivityChain().c_str(), 0,
- nullptr, 0) == 0;
- case eFilterTargetCategory:
- // Empty fields never match a condition.
- if (!message.HasCategory())
- return false;
- return ::regexec(&m_regex, message.GetCategory(), 0, nullptr,
- 0) == 0;
- case eFilterTargetMessage:
- {
- const char *message_text = message.GetMessage();
- if (!message_text)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "LogFilterRegex: regex "
- "\"%s\" no match due to nullptr message.",
- m_regex_text.c_str());
- return false;
- }
-
- bool match = ::regexec(&m_regex, message_text, 0,
- nullptr, 0) == 0;
- DNBLogThreadedIf(LOG_DARWIN_LOG, "LogFilterRegex: regex "
- "\"%s\" %s message \"%s\".",
- m_regex_text.c_str(),
- match ? "matches" : "does not match",
- message_text);
- return match;
- }
- case eFilterTargetSubsystem:
- // Empty fields never match a condition.
- if (!message.HasSubsystem())
- return false;
- return ::regexec(&m_regex, message.GetSubsystem(), 0, nullptr,
- 0) == 0;
- default:
- // We don't know this type.
- return false;
- }
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.h
deleted file mode 100644
index 796a62500ff..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogFilterRegex.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//===-- LogFilterRegex.h ----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#ifndef LogFilterRegex_h
-#define LogFilterRegex_h
-
-// C includes
-#include <regex.h>
-
-// C++ includes
-#include <string>
-
-#include "DarwinLogInterfaces.h"
-#include "DarwinLogTypes.h"
-#include "LogFilter.h"
-
-class LogFilterRegex : public LogFilter
-{
-public:
-
- LogFilterRegex(bool match_accepts, FilterTarget filter_target,
- const std::string &regex);
-
- virtual
- ~LogFilterRegex();
-
- bool
- IsValid() const
- {
- return m_is_valid;
- }
-
- const char*
- GetErrorAsCString() const
- {
- return m_error_text.c_str();
- }
-
- bool
- DoesMatch(const LogMessage &message) const override;
-
-private:
-
- const FilterTarget m_filter_target;
- const std::string m_regex_text;
- regex_t m_regex;
- bool m_is_valid;
- std::string m_error_text;
-};
-
-#endif /* LogFilterSubsystemRegex_hpp */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.cpp
deleted file mode 100644
index d98bb3de3c1..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-//===-- LogMessage.cpp ------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#include "LogMessage.h"
-
-LogMessage::LogMessage()
-{
-}
-
-LogMessage::~LogMessage()
-{
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h
deleted file mode 100644
index 0ec2b4277a4..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//===-- LogMessage.h --------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LogMessage_h
-#define LogMessage_h
-
-#include <string>
-
-class LogMessage
-{
-public:
-
- virtual
- ~LogMessage();
-
- virtual bool
- HasActivity() const = 0;
-
- virtual const char*
- GetActivity() const = 0;
-
- virtual std::string
- GetActivityChain() const = 0;
-
- virtual bool
- HasCategory() const = 0;
-
- virtual const char*
- GetCategory() const = 0;
-
- virtual bool
- HasSubsystem() const = 0;
-
- virtual const char*
- GetSubsystem() const = 0;
-
- // This can be expensive, so once we ask for it, we'll cache the result.
- virtual const char*
- GetMessage() const = 0;
-
-protected:
-
- LogMessage();
-
-};
-
-#endif /* LogMessage_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.cpp b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.cpp
deleted file mode 100644
index f3b6e443918..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-//===-- LogMessageOsLog.cpp -------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LogMessageOsLog.h"
-
-#include "ActivityStore.h"
-#include "ActivityStreamSPI.h"
-
-namespace
-{
- static os_log_copy_formatted_message_t s_log_copy_formatted_message;
-}
-
-void
-LogMessageOsLog::SetFormatterFunction(os_log_copy_formatted_message_t
- format_func)
-{
- s_log_copy_formatted_message = format_func;
-}
-
-LogMessageOsLog::LogMessageOsLog(const ActivityStore &activity_store,
- ActivityStreamEntry &entry) :
- LogMessage(),
- m_activity_store(activity_store),
- m_entry(entry),
- m_message()
-{
-}
-
-bool
-LogMessageOsLog::HasActivity() const
-{
- return m_entry.activity_id != 0;
-}
-
-const char*
-LogMessageOsLog::GetActivity() const
-{
- return m_activity_store.GetActivityForID(m_entry.activity_id);
-}
-
-std::string
-LogMessageOsLog::GetActivityChain() const
-{
- return m_activity_store.GetActivityChainForID(m_entry.activity_id);
-}
-
-bool
-LogMessageOsLog::HasCategory() const
-{
- return m_entry.log_message.category &&
- (m_entry.log_message.category[0] != 0);
-}
-
-const char*
-LogMessageOsLog::GetCategory() const
-{
- return m_entry.log_message.category;
-}
-
-bool
-LogMessageOsLog::HasSubsystem() const
-{
- return m_entry.log_message.subsystem &&
- (m_entry.log_message.subsystem[0] != 0);
-}
-
-const char*
-LogMessageOsLog::GetSubsystem() const
-{
- return m_entry.log_message.subsystem;
-}
-
-const char*
-LogMessageOsLog::GetMessage() const
-{
- if (m_message.empty())
- {
- std::unique_ptr<char[]> formatted_message(
- s_log_copy_formatted_message(&m_entry.log_message));
- if (formatted_message)
- m_message = formatted_message.get();
- // else
- // TODO log
- }
-
- // This is safe to return as we're not modifying it once we've formatted it.
- return m_message.c_str();
-}
diff --git a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.h b/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.h
deleted file mode 100644
index 7c02059fc57..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//===-- LogMessageOsLog.h ---------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#ifndef LogMessageOsLog_h
-#define LogMessageOsLog_h
-
-#include "DarwinLogInterfaces.h"
-
-#include "ActivityStreamSPI.h"
-#include "LogMessage.h"
-
-using ActivityStreamEntry = struct os_activity_stream_entry_s;
-
-// -----------------------------------------------------------------------------
-/// Provides a unified wrapper around os_log()-style log messages.
-///
-/// The lifetime of this class is intended to be very short. The caller
-/// must ensure that the passed in ActivityStore and ActivityStreamEntry
-/// outlive this LogMessageOsLog entry.
-// -----------------------------------------------------------------------------
-
-class LogMessageOsLog : public LogMessage
-{
-public:
-
- static void
- SetFormatterFunction(os_log_copy_formatted_message_t format_func);
-
- LogMessageOsLog(const ActivityStore &activity_store,
- ActivityStreamEntry &entry);
-
- // API methods
-
- bool
- HasActivity() const override;
-
- const char*
- GetActivity() const override;
-
- std::string
- GetActivityChain() const override;
-
- bool
- HasCategory() const override;
-
- const char*
- GetCategory() const override;
-
- bool
- HasSubsystem() const override;
-
- const char*
- GetSubsystem() const override;
-
- const char*
- GetMessage() const override;
-
-private:
-
- const ActivityStore &m_activity_store;
- ActivityStreamEntry &m_entry;
- mutable std::string m_message;
-
-};
-
-#endif /* LogMessageOsLog_h */
diff --git a/lldb/tools/debugserver/source/MacOSX/OsLogger.cpp b/lldb/tools/debugserver/source/MacOSX/OsLogger.cpp
deleted file mode 100644
index 1f424e7da17..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/OsLogger.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-//===-- OsLogger.cpp --------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "OsLogger.h"
-
-#if LLDB_USE_OS_LOG
-
-#include <os/log.h>
-
-#include "DNBDefs.h"
-#include "DNBLog.h"
-
-#define LLDB_OS_LOG_MAX_BUFFER_LENGTH 256
-
-namespace
-{
- //----------------------------------------------------------------------
- // Darwin os_log logging callback that can be registered with
- // DNBLogSetLogCallback
- //----------------------------------------------------------------------
- void
- DarwinLogCallback(void *baton, uint32_t flags, const char *format,
- va_list args)
- {
- if (format == nullptr)
- return;
-
- static os_log_t g_logger;
- if (!g_logger)
- {
- g_logger = os_log_create("com.apple.dt.lldb", "debugserver");
- if (!g_logger)
- return;
- }
-
- os_log_type_t log_type;
- if (flags & DNBLOG_FLAG_FATAL) log_type = OS_LOG_TYPE_FAULT;
- else if (flags & DNBLOG_FLAG_ERROR) log_type = OS_LOG_TYPE_ERROR;
- else if (flags & DNBLOG_FLAG_WARNING) log_type = OS_LOG_TYPE_DEFAULT;
- else if (flags & DNBLOG_FLAG_VERBOSE) log_type = OS_LOG_TYPE_DEBUG;
- else log_type = OS_LOG_TYPE_DEFAULT;
-
- // This code is unfortunate. os_log* only takes static strings, but
- // our current log API isn't set up to make use of that style.
- char buffer[LLDB_OS_LOG_MAX_BUFFER_LENGTH];
- vsnprintf(buffer, sizeof(buffer), format, args);
- os_log_with_type(g_logger, log_type, "%{public}s", buffer);
- }
-}
-
-DNBCallbackLog
-OsLogger::GetLogFunction()
-{
- return _os_log_impl ? DarwinLogCallback : nullptr;
-}
-
-#else
-
-DNBCallbackLog
-OsLogger::GetLogFunction()
-{
- return nullptr;
-}
-
-#endif
diff --git a/lldb/tools/debugserver/source/MacOSX/OsLogger.h b/lldb/tools/debugserver/source/MacOSX/OsLogger.h
deleted file mode 100644
index 6733b925335..00000000000
--- a/lldb/tools/debugserver/source/MacOSX/OsLogger.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//===-- OsLogger.h ----------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef OsLogger_h
-#define OsLogger_h
-
-#include "DNBDefs.h"
-
-class OsLogger
-{
-public:
-
- static DNBCallbackLog
- GetLogFunction();
-
-};
-
-#endif /* OsLogger_h */
diff --git a/lldb/tools/debugserver/source/RNBContext.cpp b/lldb/tools/debugserver/source/RNBContext.cpp
index 0b44fdbd581..74ba5c45cb4 100644
--- a/lldb/tools/debugserver/source/RNBContext.cpp
+++ b/lldb/tools/debugserver/source/RNBContext.cpp
@@ -245,8 +245,6 @@ RNBContext::EventsAsString (nub_event_t events, std::string& s)
s += "proc_stdio_available ";
if (events & event_proc_profile_data)
s += "proc_profile_data ";
- if (events & event_darwin_log_data_available)
- s += "darwin_log_data_available ";
if (events & event_read_packet_available)
s += "read_packet_available ";
if (events & event_read_thread_running)
diff --git a/lldb/tools/debugserver/source/RNBContext.h b/lldb/tools/debugserver/source/RNBContext.h
index 83237ebccd9..34fb9796ebe 100644
--- a/lldb/tools/debugserver/source/RNBContext.h
+++ b/lldb/tools/debugserver/source/RNBContext.h
@@ -25,23 +25,21 @@ class RNBContext
public:
enum
{
- event_proc_state_changed = 0x001,
- event_proc_thread_running = 0x002, // Sticky
- event_proc_thread_exiting = 0x004,
- event_proc_stdio_available = 0x008,
- event_proc_profile_data = 0x010,
- event_read_packet_available = 0x020,
- event_read_thread_running = 0x040, // Sticky
- event_read_thread_exiting = 0x080,
- event_darwin_log_data_available = 0x100,
+ event_proc_state_changed = 0x01,
+ event_proc_thread_running = 0x02, // Sticky
+ event_proc_thread_exiting = 0x04,
+ event_proc_stdio_available = 0x08,
+ event_proc_profile_data = 0x10,
+ event_read_packet_available = 0x20,
+ event_read_thread_running = 0x40, // Sticky
+ event_read_thread_exiting = 0x80,
normal_event_bits = event_proc_state_changed |
event_proc_thread_exiting |
event_proc_stdio_available |
event_proc_profile_data |
event_read_packet_available |
- event_read_thread_exiting |
- event_darwin_log_data_available,
+ event_read_thread_exiting,
sticky_event_bits = event_proc_thread_running |
event_read_thread_running,
diff --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp
index 11abe3c5d78..30b804316a1 100644
--- a/lldb/tools/debugserver/source/RNBRemote.cpp
+++ b/lldb/tools/debugserver/source/RNBRemote.cpp
@@ -26,18 +26,14 @@
#include <sched.h>
#endif
-#include "DarwinLogCollector.h"
-#include "DarwinLogEvent.h"
#include "DNB.h"
#include "DNBDataRef.h"
#include "DNBLog.h"
#include "DNBThreadResumeActions.h"
#include "JSONGenerator.h"
-#include "OsLogger.h"
#include "RNBContext.h"
#include "RNBServices.h"
#include "RNBSocket.h"
-#include "JSON.h"
#include "lldb/Utility/StringExtractor.h"
#include "MacOSX/Genealogy.h"
#include "JSONGenerator.h"
@@ -56,15 +52,6 @@
#include <TargetConditionals.h> // for endianness predefines
//----------------------------------------------------------------------
-// constants
-//----------------------------------------------------------------------
-
-static const std::string OS_LOG_EVENTS_KEY_NAME("events");
-static const std::string JSON_ASYNC_TYPE_KEY_NAME("type");
-static const DarwinLogEventVector::size_type
- DARWIN_LOG_MAX_EVENTS_PER_PACKET = 10;
-
-//----------------------------------------------------------------------
// std::iostream formatting macros
//----------------------------------------------------------------------
#define RAW_HEXBASE std::setfill('0') << std::hex << std::right
@@ -90,12 +77,6 @@ static const DarwinLogEventVector::size_type
#define INDENT_WITH_TABS(iword_idx) std::setfill('\t') << std::setw((iword_idx)) << ""
// Class to handle communications via gdb remote protocol.
-//----------------------------------------------------------------------
-// Prototypes
-//----------------------------------------------------------------------
-
-static std::string
-binary_encode_string (const std::string &s);
//----------------------------------------------------------------------
// Decode a single hex character and return the hex value as a number or
@@ -333,10 +314,9 @@ RNBRemote::CreatePacketTable ()
t.push_back (Packet (set_detach_on_error, &RNBRemote::HandlePacket_QSetDetachOnError, NULL, "QSetDetachOnError:", "Set whether debugserver will detach (1) or kill (0) from the process it is controlling if it loses connection to lldb."));
t.push_back (Packet (speed_test, &RNBRemote::HandlePacket_qSpeedTest, NULL, "qSpeedTest:", "Test the maximum speed at which packet can be sent/received."));
t.push_back (Packet (query_transfer, &RNBRemote::HandlePacket_qXfer, NULL, "qXfer:", "Support the qXfer packet."));
- t.push_back (Packet (query_supported_async_json_packets, &RNBRemote::HandlePacket_qStructuredDataPlugins, NULL, "qStructuredDataPlugins", "Query for the structured data plugins supported by the remote."));
- t.push_back (Packet (configure_darwin_log, &RNBRemote::HandlePacket_QConfigureDarwinLog, NULL, "QConfigureDarwinLog:", "Configure the DarwinLog structured data plugin support."));
}
+
void
RNBRemote::FlushSTDIO ()
{
@@ -384,86 +364,6 @@ RNBRemote::SendAsyncProfileData ()
}
}
-void
-RNBRemote::SendAsyncDarwinLogData ()
-{
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): enter",
- __FUNCTION__);
-
- if (!m_ctx.HasValidProcessID())
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): ignoring due to"
- "invalid process id", __FUNCTION__);
- return;
- }
-
- nub_process_t pid = m_ctx.ProcessID();
- DarwinLogEventVector::size_type entry_count = 0;
-
- // NOTE: the current looping structure here does nothing
- // to guarantee that we can send off async packets faster
- // than we generate them. It will keep sending as long
- // as there's data to send.
- do
- {
- DarwinLogEventVector events =
- DNBProcessGetAvailableDarwinLogEvents(pid);
- entry_count = events.size();
-
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): outer loop enter",
- __FUNCTION__);
-
- for (DarwinLogEventVector::size_type base_entry = 0;
- base_entry < entry_count;
- base_entry += DARWIN_LOG_MAX_EVENTS_PER_PACKET)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): inner loop enter",
- __FUNCTION__);
-
- // We limit the total number of entries we pack
- // into a single JSON async packet just so it
- // doesn't get too large.
- JSONGenerator::Dictionary async_dictionary;
-
- // Specify the type of the JSON async data we're sending.
- async_dictionary.AddStringItem(
- JSON_ASYNC_TYPE_KEY_NAME, "DarwinLog");
-
- // Create an array entry in the dictionary to hold all
- // the events going in this packet.
- JSONGenerator::ArraySP events_array(new JSONGenerator::Array());
- async_dictionary.AddItem(OS_LOG_EVENTS_KEY_NAME, events_array);
-
- // We bundle up to DARWIN_LOG_MAX_EVENTS_PER_PACKET events in
- // a single packet.
- const auto inner_loop_bound =
- std::min(base_entry + DARWIN_LOG_MAX_EVENTS_PER_PACKET,
- entry_count);
- for (DarwinLogEventVector::size_type i = base_entry;
- i < inner_loop_bound; ++i)
- {
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): adding "
- "entry index %lu to the JSON packet",
- __FUNCTION__, i);
- events_array->AddItem(events[i]);
- }
-
- // Send off the packet.
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): sending JSON "
- "packet, %lu entries remain", __FUNCTION__,
- entry_count - inner_loop_bound);
- SendAsyncJSONPacket(async_dictionary);
- }
-
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): outer loop exit",
- __FUNCTION__);
-
- } while (entry_count > 0);
-
- DNBLogThreadedIf(LOG_DARWIN_LOG, "RNBRemote::%s(): exit",
- __PRETTY_FUNCTION__);
-}
-
rnb_err_t
RNBRemote::SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer)
{
@@ -512,19 +412,6 @@ RNBRemote::SendAsyncProfileDataPacket (char *buf, nub_size_t buf_size)
return SendPacket(packet);
}
-rnb_err_t
-RNBRemote::SendAsyncJSONPacket(const JSONGenerator::Dictionary &dictionary)
-{
- std::ostringstream stream;
- // We're choosing something that is easy to spot if we somehow get one
- // of these coming out at the wrong time (i.e. when the remote side
- // is not waiting for a process control completion response).
- stream << "JSON-async:";
- dictionary.Dump(stream);
- const std::string payload = binary_encode_string(stream.str());
- return SendPacket(payload);
-}
-
// Given a std::string packet contents to send, possibly encode/compress it.
// If compression is enabled, the returned std::string will be in one of two
// forms:
@@ -1212,11 +1099,12 @@ decode_binary_data (const char *str, size_t len)
while (len--)
{
- unsigned char c = *str++;
+ unsigned char c = *str;
if (c == 0x7d && len > 0)
{
len--;
- c = *str++ ^ 0x20;
+ str++;
+ c = *str ^ 0x20;
}
bytes.push_back (c);
}
@@ -1226,7 +1114,7 @@ decode_binary_data (const char *str, size_t len)
// Quote any meta characters in a std::string as per the binary
// packet convention in the gdb-remote protocol.
-static std::string
+std::string
binary_encode_string (const std::string &s)
{
std::string output;
@@ -2149,11 +2037,6 @@ set_logging (const char *p)
p += sizeof ("LOG_RNB_DEFAULT") - 1;
bitmask |= LOG_RNB_DEFAULT;
}
- else if (strncmp (p, "LOG_DARWIN_LOG", sizeof ("LOG_DARWIN_LOG") - 1) == 0)
- {
- p += sizeof ("LOG_DARWIN_LOG") - 1;
- bitmask |= LOG_DARWIN_LOG;
- }
else if (strncmp (p, "LOG_RNB_NONE", sizeof ("LOG_RNB_NONE") - 1) == 0)
{
p += sizeof ("LOG_RNB_NONE") - 1;
@@ -2185,26 +2068,14 @@ set_logging (const char *p)
// Did we get a properly formatted logging bitmask?
if (p && *p == ';')
{
- // Enable DNB logging.
- // Use the existing log callback if one was already configured.
- if (!DNBLogGetLogCallback())
- {
- // Use the os_log()-based logger if available; otherwise,
- // fallback to ASL.
- auto log_callback = OsLogger::GetLogFunction();
- if (log_callback)
- DNBLogSetLogCallback(log_callback, nullptr);
- else
- DNBLogSetLogCallback(ASLLogCallback, nullptr);
- }
-
- // Update logging to use the configured log channel bitmask.
+ // Enable DNB logging
+ DNBLogSetLogCallback(ASLLogCallback, NULL);
DNBLogSetLogMask (bitmask);
p++;
}
}
// We're not going to support logging to a file for now. All logging
- // goes through ASL or the previously arranged log callback.
+ // goes through ASL.
#if 0
else if (strncmp (p, "mode=", sizeof ("mode=") - 1) == 0)
{
@@ -2435,99 +2306,6 @@ RNBRemote::HandlePacket_QSetDetachOnError (const char *p)
}
rnb_err_t
-RNBRemote::HandlePacket_qStructuredDataPlugins(const char *p)
-{
- // We'll return a JSON array of supported packet types.
- // The type is significant. For each of the supported
- // packet types that have been enabled, there will be a
- // 'J' async packet sent to the client with payload data.
- // This payload data will be a JSON dictionary, and the
- // top level dictionary will contain a string field with
- // its value set to the relevant packet type from this list.
- JSONGenerator::Array supported_json_packets;
-
- // Check for DarwinLog (libtrace os_log/activity support).
- if (DarwinLogCollector::IsSupported())
- supported_json_packets.AddItem(JSONGenerator::StringSP(
- new JSONGenerator::String("DarwinLog")));
-
- // Send back the array.
- std::ostringstream stream;
- supported_json_packets.Dump(stream);
- return SendPacket(stream.str());
-}
-
-rnb_err_t
-RNBRemote::HandlePacket_QConfigureDarwinLog(const char *p)
-{
- if (!DarwinLogCollector::IsSupported())
- {
- // We should never have been given this request.
- return SendPacket ("E89");
- }
-
- // Ensure we have a process. We expect a separate configure request for
- // each process launched/attached.
- const nub_process_t pid = m_ctx.ProcessID();
- if (pid == INVALID_NUB_PROCESS)
- return SendPacket ("E94");
-
- // Get the configuration dictionary.
- p += strlen("QConfigureDarwinLog:");
-
- // The configuration dictionary is binary encoded.
- std::vector<uint8_t> unescaped_config_data = decode_binary_data(p, -1);
- std::string unescaped_config_string((const char*)&unescaped_config_data[0],
- unescaped_config_data.size());
- DNBLogThreadedIf(LOG_DARWIN_LOG, "DarwinLog: received config data: \"%s\"",
- unescaped_config_string.c_str());
- auto configuration_sp =
- JSONParser(unescaped_config_string.c_str()).ParseJSONValue();
- if (!configuration_sp)
- {
- // Malformed request - we require configuration data
- // indicating whether we're enabling or disabling.
- return SendPacket("E90");
- }
-
- if (!JSONObject::classof(configuration_sp.get()))
- {
- // Configuration data is not of the right type.
- return SendPacket("E91");
- }
- JSONObject &config_dict = *static_cast<JSONObject*>(configuration_sp.get());
-
- // Check if we're enabling or disabling.
- auto enabled_sp = config_dict.GetObject("enabled");
- if (!enabled_sp)
- {
- // Missing required "enabled" field.
- return SendPacket("E92");
- }
- if (!JSONTrue::classof(enabled_sp.get()) &&
- !JSONFalse::classof(enabled_sp.get()))
- {
- // Should be a boolean type, but wasn't.
- return SendPacket("E93");
- }
- const bool enabling = JSONTrue::classof(enabled_sp.get());
-
- // TODO - handle other configuration parameters here.
-
- // Shut down any active activity stream for the process.
- DarwinLogCollector::CancelStreamForProcess(pid);
-
- if (enabling)
- {
- // Look up the procecess.
- if (!DarwinLogCollector::StartCollectingForProcess(pid, config_dict))
- return SendPacket("E95");
- }
-
- return SendPacket("OK");
-}
-
-rnb_err_t
RNBRemote::HandlePacket_QListThreadsInStopReply (const char *p)
{
// If this packet is received, it allows us to send an extra key/value
@@ -5732,33 +5510,26 @@ RNBRemote::HandlePacket_jThreadExtendedInfo (const char *p)
if (need_vouchers_comma_sep)
json << ",";
need_vouchers_comma_sep = true;
+ json << "\"process_infos\":[";
bool printed_one_process_info = false;
for (auto iter = process_info_indexes.begin(); iter != process_info_indexes.end(); ++iter)
{
if (printed_one_process_info)
json << ",";
+ else
+ printed_one_process_info = true;
Genealogy::ProcessExecutableInfoSP image_info_sp;
uint32_t idx = *iter;
image_info_sp = DNBGetGenealogyImageInfo (pid, idx);
- if (image_info_sp)
- {
- if (!printed_one_process_info)
- {
- json << "\"process_infos\":[";
- printed_one_process_info = true;
- }
-
- json << "{";
- char uuid_buf[37];
- uuid_unparse_upper (image_info_sp->image_uuid, uuid_buf);
- json << "\"process_info_index\":" << idx << ",";
- json << "\"image_path\":\"" << json_string_quote_metachars (image_info_sp->image_path) << "\",";
- json << "\"image_uuid\":\"" << uuid_buf <<"\"";
- json << "}";
- }
+ json << "{";
+ char uuid_buf[37];
+ uuid_unparse_upper (image_info_sp->image_uuid, uuid_buf);
+ json << "\"process_info_index\":" << idx << ",";
+ json << "\"image_path\":\"" << json_string_quote_metachars (image_info_sp->image_path) << "\",";
+ json << "\"image_uuid\":\"" << uuid_buf <<"\"";
+ json << "}";
}
- if (printed_one_process_info)
- json << "]";
+ json << "]";
}
}
else
diff --git a/lldb/tools/debugserver/source/RNBRemote.h b/lldb/tools/debugserver/source/RNBRemote.h
index 57c2a22e8df..1bf7535e141 100644
--- a/lldb/tools/debugserver/source/RNBRemote.h
+++ b/lldb/tools/debugserver/source/RNBRemote.h
@@ -135,8 +135,6 @@ public:
speed_test, // 'qSpeedTest:'
set_detach_on_error, // 'QSetDetachOnError:'
query_transfer, // 'qXfer:'
- query_supported_async_json_packets, // 'QSupportedAsyncJSONPackets'
- configure_darwin_log, // 'ConfigureDarwinLog:'
unknown_type
} PacketEnum;
@@ -253,8 +251,6 @@ public:
rnb_err_t HandlePacket_qXfer (const char *p);
rnb_err_t HandlePacket_stop_process (const char *p);
rnb_err_t HandlePacket_QSetDetachOnError (const char *p);
- rnb_err_t HandlePacket_qStructuredDataPlugins (const char *p);
- rnb_err_t HandlePacket_QConfigureDarwinLog (const char *p);
rnb_err_t SendStopReplyPacketForThread (nub_thread_t tid);
rnb_err_t SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer);
@@ -263,8 +259,6 @@ public:
void FlushSTDIO ();
void SendAsyncProfileData ();
rnb_err_t SendAsyncProfileDataPacket (char *buf, nub_size_t buf_size);
- void SendAsyncDarwinLogData ();
- rnb_err_t SendAsyncJSONPacket (const JSONGenerator::Dictionary &dictionary);
RNBContext& Context() { return m_ctx; }
RNBSocket& Comm() { return m_comm; }
diff --git a/lldb/tools/debugserver/source/debugserver.cpp b/lldb/tools/debugserver/source/debugserver.cpp
index e1ee2c12131..e9ddbf47faa 100644
--- a/lldb/tools/debugserver/source/debugserver.cpp
+++ b/lldb/tools/debugserver/source/debugserver.cpp
@@ -34,7 +34,6 @@ extern "C" int proc_set_wakemon_params(pid_t, int, int); // <libproc_internal.h>
#include "DNB.h"
#include "DNBLog.h"
#include "DNBTimer.h"
-#include "OsLogger.h"
#include "PseudoTerminal.h"
#include "RNBContext.h"
#include "RNBServices.h"
@@ -525,9 +524,6 @@ RNBRunLoopInferiorExecuting (RNBRemote *remote)
// Clear some bits if we are not running so we don't send any async packets
event_mask &= ~RNBContext::event_proc_stdio_available;
event_mask &= ~RNBContext::event_proc_profile_data;
- // When we enable async structured data packets over another logical channel,
- // this can be relaxed.
- event_mask &= ~RNBContext::event_darwin_log_data_available;
}
// We want to make sure we consume all process state changes and have
@@ -552,11 +548,6 @@ RNBRunLoopInferiorExecuting (RNBRemote *remote)
remote->SendAsyncProfileData();
}
- if (set_events & RNBContext::event_darwin_log_data_available)
- {
- remote->SendAsyncDarwinLogData();
- }
-
if (set_events & RNBContext::event_read_packet_available)
{
// handleReceivedPacket will take care of resetting the
@@ -1316,20 +1307,7 @@ main (int argc, char *argv[])
else
{
// Enable DNB logging
-
- // if os_log() support is available, log through that.
- auto log_callback = OsLogger::GetLogFunction();
- if (log_callback)
- {
- DNBLogSetLogCallback(log_callback, nullptr);
- DNBLog("debugserver will use os_log for internal logging.");
- }
- else
- {
- // Fall back to ASL support.
- DNBLogSetLogCallback(ASLLogCallback, NULL);
- DNBLog("debugserver will use ASL for internal logging.");
- }
+ DNBLogSetLogCallback(ASLLogCallback, NULL);
DNBLogSetLogMask (log_flags);
}
OpenPOWER on IntegriCloud