| Index: src/plugin/PluginDebug.cpp |
| diff --git a/src/plugin/PluginDebug.cpp b/src/plugin/PluginDebug.cpp |
| index 0b08e87e25f52cf6f2aad23f97e50021c8b6ebef..c2521b046480a2948c4bd2f0307379a8e41158ba 100644 |
| --- a/src/plugin/PluginDebug.cpp |
| +++ b/src/plugin/PluginDebug.cpp |
| @@ -1,258 +1,338 @@ |
| -/* |
| - * This file is part of Adblock Plus <https://adblockplus.org/>, |
| - * Copyright (C) 2006-2015 Eyeo GmbH |
| - * |
| - * Adblock Plus is free software: you can redistribute it and/or modify |
| - * it under the terms of the GNU General Public License version 3 as |
| - * published by the Free Software Foundation. |
| - * |
| - * Adblock Plus is distributed in the hope that it will be useful, |
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| - * GNU General Public License for more details. |
| - * |
| - * You should have received a copy of the GNU General Public License |
| - * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| - */ |
| - |
| -#include "PluginStdAfx.h" |
| - |
| -#include "PluginDebug.h" |
| -#include "PluginMutex.h" |
| -#include "PluginSettings.h" |
| - |
| -class CPluginDebugLock : public CPluginMutex |
| -{ |
| - |
| -private: |
| - |
| - static CComAutoCriticalSection s_criticalSectionDebugLock; |
| - |
| -public: |
| - |
| - CPluginDebugLock() : CPluginMutex(L"DebugFile", PLUGIN_ERROR_MUTEX_DEBUG_FILE) |
| - { |
| - s_criticalSectionDebugLock.Lock(); |
| - } |
| - |
| - ~CPluginDebugLock() |
| - { |
| - s_criticalSectionDebugLock.Unlock(); |
| - } |
| -}; |
| - |
| -CComAutoCriticalSection CPluginDebugLock::s_criticalSectionDebugLock; |
| - |
| -void CPluginDebug::DebugSystemException(const std::system_error& ex, int errorId, int errorSubid, const std::string& description) |
| -{ |
| +/* |
| + * This file is part of Adblock Plus <https://adblockplus.org/>, |
| + * Copyright (C) 2006-2015 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +#include "PluginStdAfx.h" |
| + |
| +#include "PluginDebug.h" |
| +#include "Exception.h" |
| +#include "PluginMutex.h" |
| +#include "PluginSettings.h" |
| + |
| +#if (defined ENABLE_DEBUG_INFO) |
| +namespace { |
| + // VS 2012 does not have support for variadic templates, which would eliminate the need for an argument class. |
| + struct LogHandlersArguments |
| + { |
| + bool isEntryPoint; |
| + std::string name; |
| + }; |
| + |
| + std::string DefaultLogMessage(const LogHandlersArguments& x, const std::string &exceptionType) |
| + { |
| + std::string s = x.isEntryPoint ? "ENTRY POINT '" : "'"; |
| + s += x.name; |
| + s += "' caught default "; |
| + s += exceptionType; |
| + return s; |
| + } |
| + |
| + struct LogHandlers |
| + { |
| + static void Unknown(const LogHandlersArguments& args) |
| + { |
| + CPluginDebug::Debug(DefaultLogMessage(args, "Unknown exception")); |
| + } |
| + static void Exception(const std::exception& ex, LogHandlersArguments& args) |
| + { |
| + CPluginDebug::DebugOrdinaryException(ex, |
| + PLUGIN_ERROR_ENTRY_POINT, PLUGIN_ERROR_ENTRY_POINT_CATCHALL_EXCEPTION, |
| + DefaultLogMessage(args, "std::exception")); |
| + } |
| + static void LogicError(const std::logic_error& ex, LogHandlersArguments& args) |
| + { |
| + CPluginDebug::DebugOrdinaryException(ex, |
| + PLUGIN_ERROR_ENTRY_POINT, PLUGIN_ERROR_ENTRY_POINT_CATCHALL_EXCEPTION, |
| + DefaultLogMessage(args, "std::logic_error")); |
| + } |
| + static void RuntimeError(const std::runtime_error& ex, LogHandlersArguments& args) |
| + { |
| + CPluginDebug::DebugOrdinaryException(ex, |
| + PLUGIN_ERROR_ENTRY_POINT, PLUGIN_ERROR_ENTRY_POINT_CATCHALL_EXCEPTION, |
| + DefaultLogMessage(args, "std::runtime_error")); |
| + } |
| + static void SystemError(const std::system_error& ex, LogHandlersArguments& args) |
| + { |
| + CPluginDebug::DebugSystemException(ex, |
| + PLUGIN_ERROR_ENTRY_POINT, PLUGIN_ERROR_ENTRY_POINT_CATCHALL_EXCEPTION, |
| + DefaultLogMessage(args, "std::std::system_error")); |
| + } |
| + }; |
| +} |
| +#endif |
| + |
| +void EntryPointExceptionDefault(const std::string& name) |
| +{ |
| +#if (defined ENABLE_DEBUG_INFO) |
| + // VS 2012 does not have support for brace initializer lists; otherwise this could be a single line |
| + LogHandlersArguments x; |
| + x.isEntryPoint = true; |
| + x.name = name; |
| + CatchAllVoid<LogHandlers>::Handler(x); |
| +#endif |
| +} |
| + |
| +void ExceptionDefault(const std::string& name) |
| +{ |
| +#if (defined ENABLE_DEBUG_INFO) |
| + LogHandlersArguments x; |
| + x.isEntryPoint = false; |
| + x.name = name; |
| + CatchAllVoid<LogHandlers>::Handler(x); |
| +#endif |
| +} |
| + |
| +class CPluginDebugLock : public CPluginMutex |
| +{ |
| + |
| +private: |
| + |
| + static CComAutoCriticalSection s_criticalSectionDebugLock; |
| + |
| +public: |
| + |
| + CPluginDebugLock() : CPluginMutex(L"DebugFile", PLUGIN_ERROR_MUTEX_DEBUG_FILE) |
| + { |
| + s_criticalSectionDebugLock.Lock(); |
| + } |
| + |
| + ~CPluginDebugLock() |
| + { |
| + s_criticalSectionDebugLock.Unlock(); |
| + } |
| +}; |
| + |
| +CComAutoCriticalSection CPluginDebugLock::s_criticalSectionDebugLock; |
| + |
| +void CPluginDebug::DebugSystemException(const std::system_error& ex, int errorId, int errorSubid, const std::string& description) |
| +{ |
| std::string message = description + ", " + ex.code().message() + ", " + ex.what(); |
| DEBUG_ERROR_LOG(ex.code().value(), errorId, errorSubid, message); |
| -} |
| - |
| -#ifdef ENABLE_DEBUG_INFO |
| - |
| -void DebugLegacy(const CString& text, DWORD dwProcessId, DWORD dwThreadId) |
| -{ |
| -#ifdef USE_CONSOLE |
| - CONSOLE("%s", CT2A(text.GetString(), CP_UTF8)); |
| -#endif |
| - |
| - if (CPluginSettings::HasInstance()) |
| - { |
| -#ifdef ENABLE_DEBUG_SPLIT_FILE |
| - CPluginSettings* settings = CPluginSettings::GetInstance(); |
| - |
| - bool isWorkingThread = settings->IsWorkingThread(dwThreadId); |
| - |
| - std::wstring processor; |
| - wchar_t tmp[10]; |
| - _itow_s(::GetCurrentProcessId(), tmp, 10); |
| - if (isWorkingThread) |
| - processor = L"tab" + std::wstring(tmp) + L"_thread"; |
| - else |
| - processor = L"tab" + std::wstring(tmp) + L"_ui"; |
| -#else |
| - if (dwProcessId == 0) |
| - { |
| - dwProcessId = ::GetCurrentProcessId(); |
| - } |
| - if (dwThreadId == 0) |
| - { |
| - dwThreadId = ::GetCurrentThreadId(); |
| - } |
| - |
| - CStringA processInfo; |
| - processInfo.Format("%4.4u.%4.4u - ", dwProcessId, dwThreadId); |
| -#endif |
| - SYSTEMTIME st; |
| - ::GetSystemTime(&st); |
| - |
| - CStringA sysTime; |
| - sysTime.Format("%2.2d:%2.2d:%2.2d.%3.3d - ", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); |
| - |
| - CPluginDebugLock lock; |
| - if (lock.IsLocked()) |
| - { |
| - std::ofstream debugFile; |
| - |
| -#ifdef ENABLE_DEBUG_SPLIT_FILE |
| - debugFile.open(GetDataPath(L"debug_" + processor + L".txt"), std::ios::app); |
| -#else |
| - debugFile.open(GetDataPath(L"debug.txt"), std::ios::app); |
| -#endif |
| - int pos = 0; |
| - CStringA line = text.Tokenize(L"\n\r", pos); |
| - |
| - while (pos >= 0) |
| - { |
| - debugFile.write(sysTime.GetBuffer(), sysTime.GetLength()); |
| -#ifndef ENABLE_DEBUG_SPLIT_FILE |
| - debugFile.write(processInfo.GetBuffer(), processInfo.GetLength()); |
| -#endif |
| - debugFile.write(line.GetBuffer(), line.GetLength()); |
| - debugFile.write("\n", 1); |
| - |
| - line = text.Tokenize(L"\n\r", pos); |
| - } |
| - |
| - debugFile.flush(); |
| - } |
| - } |
| -} |
| - |
| -void CPluginDebug::Debug(const std::string& text, DWORD processId, DWORD threadId) |
| -{ |
| - DebugLegacy(CString(text.c_str()), processId, threadId); |
| -} |
| - |
| -void CPluginDebug::Debug(const std::wstring& text, DWORD processId, DWORD threadId) |
| -{ |
| - DebugLegacy(ToCString(text), processId, threadId); |
| -} |
| - |
| -#endif |
| - |
| -#if (defined ENABLE_DEBUG_INFO) |
| - |
| -void CPluginDebug::DebugException(const std::exception& ex) |
| -{ |
| - auto error = std::string("!!! Exception:") + ex.what(); |
| -#ifdef ENABLE_DEBUG_ERROR |
| - Debug(error); |
| -#endif |
| - |
| - DEBUG_SELFTEST("********************************************************************************\n" + error + "\n********************************************************************************") |
| -} |
| - |
| -void DebugErrorCodeLegacy(DWORD errorCode, const CString& error, DWORD dwProcessId, DWORD dwThreadId) |
| -{ |
| - CString errorCodeText; |
| - errorCodeText.Format(L"%u (0x%8.8x)", errorCode, errorCode); |
| - |
| - CString finalError = error + L". error=" + errorCodeText; |
| - |
| -#ifdef ENABLE_DEBUG_ERROR |
| - DebugLegacy(finalError, dwProcessId, dwThreadId); |
| -#endif |
| - |
| - DEBUG_SELFTEST(L"********************************************************************************\n" + finalError + "\n********************************************************************************") |
| -} |
| - |
| -void CPluginDebug::DebugErrorCode(DWORD errorCode, const std::string& error, DWORD processId, DWORD threadId) |
| -{ |
| - DebugErrorCodeLegacy(errorCode, CString(error.c_str()), processId, threadId); |
| -} |
| - |
| -#endif |
| - |
| -// ============================================================================ |
| -// Debug result |
| -// ============================================================================ |
| - |
| -#ifdef ENABLE_DEBUG_RESULT |
| - |
| -void DebugResultLegacy(const CString& text) |
| -{ |
| - SYSTEMTIME st; |
| - ::GetSystemTime(&st); |
| - |
| - CStringA sysTime; |
| - sysTime.Format("%2.2d:%2.2d:%2.2d.%3.3d - ", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); |
| - |
| - CStringA textA = text; |
| - |
| - CPluginDebugLock lock; |
| - if (lock.IsLocked()) |
| - { |
| - std::ofstream debugFile; |
| - |
| - debugFile.open(GetDataPath(L"debug_result.txt"), std::ios::app); |
| - debugFile.write(sysTime.GetBuffer(), sysTime.GetLength()); |
| - debugFile.write(LPCSTR(textA), textA.GetLength()); |
| - debugFile.write("\n", 1); |
| - debugFile.flush(); |
| - } |
| -} |
| - |
| -void CPluginDebug::DebugResult(const std::wstring& text) |
| -{ |
| - DebugResultLegacy(ToCString(text)); |
| -} |
| - |
| -void CPluginDebug::DebugResultDomain(const std::wstring& domain) |
| -{ |
| - DebugResult(L"==========================================================================================================================================================================================="); |
| - DebugResult(domain); |
| - DebugResult(L"==========================================================================================================================================================================================="); |
| -} |
| - |
| - |
| -void CPluginDebug::DebugResultBlocking(const std::wstring& type, const std::wstring& src, const std::wstring& domain) |
| -{ |
| - CString srcTrunc = ToCString(src); |
| - if (src.length() > 100) |
| - { |
| - srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| - } |
| - |
| - CString blocking; |
| - blocking.Format(L"Blocked %-12s %-20s %s", ToCString(type), domain.empty()? L"-" : ToCString(domain), srcTrunc); |
| - |
| - DebugResultLegacy(blocking); |
| -} |
| - |
| - |
| -void CPluginDebug::DebugResultHiding(const std::wstring& tag, const std::wstring& id, const std::wstring& filter) |
| -{ |
| - CString srcTrunc = ToCString(id); |
| - if (srcTrunc.GetLength() > 100) |
| - { |
| - srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| - } |
| - |
| - CString blocking; |
| - blocking.Format(L"Hidden %-12s - %s %s", ToCString(tag), srcTrunc, ToCString(filter)); |
| - |
| - DebugResultLegacy(blocking); |
| -} |
| - |
| -#endif // ENABLE_DEBUG_RESULT |
| - |
| - |
| -#ifdef ENABLE_DEBUG_RESULT_IGNORED |
| - |
| -void CPluginDebug::DebugResultIgnoring(const std::wstring& type, const std::wstring& src, const std::wstring& domain) |
| -{ |
| - CString srcTrunc = ToCString(src); |
| - if (src.length() > 100) |
| - { |
| - srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| - } |
| - |
| - CString blocking; |
| - blocking.Format(L"Ignored %-12s %s %s", ToCString(type), domain.empty()? L"-" : ToCString(domain), srcTrunc); |
| - |
| - DebugResultLegacy(blocking); |
| -} |
| - |
| -#endif // ENABLE_DEBUG_RESULT_IGNORED |
| +} |
| + |
| +void CPluginDebug::DebugOrdinaryException(const std::exception& ex, int errorId, int errorSubid, const std::string& description) |
| +{ |
| + std::string message = description + ", " + ex.what(); |
| + DEBUG_ERROR_LOG(0, errorId, errorSubid, message); |
| +} |
| + |
| +#ifdef ENABLE_DEBUG_INFO |
| + |
| +void DebugLegacy(const CString& text, DWORD dwProcessId, DWORD dwThreadId) |
| +{ |
| +#ifdef USE_CONSOLE |
| + CONSOLE("%s", CT2A(text.GetString(), CP_UTF8)); |
| +#endif |
| + |
| + if (CPluginSettings::HasInstance()) |
| + { |
| +#ifdef ENABLE_DEBUG_SPLIT_FILE |
| + CPluginSettings* settings = CPluginSettings::GetInstance(); |
| + |
| + bool isWorkingThread = settings->IsWorkingThread(dwThreadId); |
| + |
| + std::wstring processor; |
| + wchar_t tmp[10]; |
| + _itow_s(::GetCurrentProcessId(), tmp, 10); |
| + if (isWorkingThread) |
| + processor = L"tab" + std::wstring(tmp) + L"_thread"; |
| + else |
| + processor = L"tab" + std::wstring(tmp) + L"_ui"; |
| +#else |
| + if (dwProcessId == 0) |
| + { |
| + dwProcessId = ::GetCurrentProcessId(); |
| + } |
| + if (dwThreadId == 0) |
| + { |
| + dwThreadId = ::GetCurrentThreadId(); |
| + } |
| + |
| + CStringA processInfo; |
| + processInfo.Format("%4.4u.%4.4u - ", dwProcessId, dwThreadId); |
| +#endif |
| + SYSTEMTIME st; |
| + ::GetSystemTime(&st); |
| + |
| + CStringA sysTime; |
| + sysTime.Format("%2.2d:%2.2d:%2.2d.%3.3d - ", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); |
| + |
| + CPluginDebugLock lock; |
| + if (lock.IsLocked()) |
| + { |
| + std::ofstream debugFile; |
| + |
| +#ifdef ENABLE_DEBUG_SPLIT_FILE |
| + debugFile.open(GetDataPath(L"debug_" + processor + L".txt"), std::ios::app); |
| +#else |
| + debugFile.open(GetDataPath(L"debug.txt"), std::ios::app); |
| +#endif |
| + int pos = 0; |
| + CStringA line = text.Tokenize(L"\n\r", pos); |
| + |
| + while (pos >= 0) |
| + { |
| + debugFile.write(sysTime.GetBuffer(), sysTime.GetLength()); |
| +#ifndef ENABLE_DEBUG_SPLIT_FILE |
| + debugFile.write(processInfo.GetBuffer(), processInfo.GetLength()); |
| +#endif |
| + debugFile.write(line.GetBuffer(), line.GetLength()); |
| + debugFile.write("\n", 1); |
| + |
| + line = text.Tokenize(L"\n\r", pos); |
| + } |
| + |
| + debugFile.flush(); |
| + } |
| + } |
| +} |
| + |
| +void CPluginDebug::Debug(const std::string& text, DWORD processId, DWORD threadId) |
| +{ |
| + DebugLegacy(CString(text.c_str()), processId, threadId); |
| +} |
| + |
| +void CPluginDebug::Debug(const std::wstring& text, DWORD processId, DWORD threadId) |
| +{ |
| + DebugLegacy(ToCString(text), processId, threadId); |
| +} |
| + |
| +#endif |
| + |
| +#if (defined ENABLE_DEBUG_INFO) |
| + |
| +void CPluginDebug::DebugException(const std::exception& ex) |
| +{ |
| + auto error = std::string("!!! Exception:") + ex.what(); |
| +#ifdef ENABLE_DEBUG_ERROR |
| + Debug(error); |
| +#endif |
| + |
| + DEBUG_SELFTEST("********************************************************************************\n" + error + "\n********************************************************************************") |
| +} |
| + |
| +void DebugErrorCodeLegacy(DWORD errorCode, const CString& error, DWORD dwProcessId, DWORD dwThreadId) |
| +{ |
| + CString errorCodeText; |
| + errorCodeText.Format(L"%u (0x%8.8x)", errorCode, errorCode); |
| + |
| + CString finalError = error + L". error=" + errorCodeText; |
| + |
| +#ifdef ENABLE_DEBUG_ERROR |
| + DebugLegacy(finalError, dwProcessId, dwThreadId); |
| +#endif |
| + |
| + DEBUG_SELFTEST(L"********************************************************************************\n" + finalError + "\n********************************************************************************") |
| +} |
| + |
| +void CPluginDebug::DebugErrorCode(DWORD errorCode, const std::string& error, DWORD processId, DWORD threadId) |
| +{ |
| + DebugErrorCodeLegacy(errorCode, CString(error.c_str()), processId, threadId); |
| +} |
| + |
| +#endif |
| + |
| +// ============================================================================ |
| +// Debug result |
| +// ============================================================================ |
| + |
| +#ifdef ENABLE_DEBUG_RESULT |
| + |
| +void DebugResultLegacy(const CString& text) |
| +{ |
| + SYSTEMTIME st; |
| + ::GetSystemTime(&st); |
| + |
| + CStringA sysTime; |
| + sysTime.Format("%2.2d:%2.2d:%2.2d.%3.3d - ", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); |
| + |
| + CStringA textA = text; |
| + |
| + CPluginDebugLock lock; |
| + if (lock.IsLocked()) |
| + { |
| + std::ofstream debugFile; |
| + |
| + debugFile.open(GetDataPath(L"debug_result.txt"), std::ios::app); |
| + debugFile.write(sysTime.GetBuffer(), sysTime.GetLength()); |
| + debugFile.write(LPCSTR(textA), textA.GetLength()); |
| + debugFile.write("\n", 1); |
| + debugFile.flush(); |
| + } |
| +} |
| + |
| +void CPluginDebug::DebugResult(const std::wstring& text) |
| +{ |
| + DebugResultLegacy(ToCString(text)); |
| +} |
| + |
| +void CPluginDebug::DebugResultDomain(const std::wstring& domain) |
| +{ |
| + DebugResult(L"==========================================================================================================================================================================================="); |
| + DebugResult(domain); |
| + DebugResult(L"==========================================================================================================================================================================================="); |
| +} |
| + |
| + |
| +void CPluginDebug::DebugResultBlocking(const std::wstring& type, const std::wstring& src, const std::wstring& domain) |
| +{ |
| + CString srcTrunc = ToCString(src); |
| + if (src.length() > 100) |
| + { |
| + srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| + } |
| + |
| + CString blocking; |
| + blocking.Format(L"Blocked %-12s %-20s %s", ToCString(type), domain.empty()? L"-" : ToCString(domain), srcTrunc); |
| + |
| + DebugResultLegacy(blocking); |
| +} |
| + |
| + |
| +void CPluginDebug::DebugResultHiding(const std::wstring& tag, const std::wstring& id, const std::wstring& filter) |
| +{ |
| + CString srcTrunc = ToCString(id); |
| + if (srcTrunc.GetLength() > 100) |
| + { |
| + srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| + } |
| + |
| + CString blocking; |
| + blocking.Format(L"Hidden %-12s - %s %s", ToCString(tag), srcTrunc, ToCString(filter)); |
| + |
| + DebugResultLegacy(blocking); |
| +} |
| + |
| +#endif // ENABLE_DEBUG_RESULT |
| + |
| + |
| +#ifdef ENABLE_DEBUG_RESULT_IGNORED |
| + |
| +void CPluginDebug::DebugResultIgnoring(const std::wstring& type, const std::wstring& src, const std::wstring& domain) |
| +{ |
| + CString srcTrunc = ToCString(src); |
| + if (src.length() > 100) |
| + { |
| + srcTrunc = srcTrunc.Left(67) + L"..." + srcTrunc.Right(30); |
| + } |
| + |
| + CString blocking; |
| + blocking.Format(L"Ignored %-12s %s %s", ToCString(type), domain.empty()? L"-" : ToCString(domain), srcTrunc); |
| + |
| + DebugResultLegacy(blocking); |
| +} |
| + |
| +#endif // ENABLE_DEBUG_RESULT_IGNORED |