Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/plugin/PluginDebug.cpp

Issue 5743529531801600: Playing with Default behavior for catch-all blocks
Patch Set: proposed changes Created March 31, 2015, 1:49 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld