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 |