| Index: base/debug.h
|
| diff --git a/base/debug.h b/base/debug.h
|
| deleted file mode 100644
|
| index 5566a0b564840b026e9161ad81e1ec207c646628..0000000000000000000000000000000000000000
|
| --- a/base/debug.h
|
| +++ /dev/null
|
| @@ -1,305 +0,0 @@
|
| -// Copyright 2003-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -//
|
| -// Debug functions
|
| -
|
| -#ifndef OMAHA_BASE_DEBUG_H_
|
| -#define OMAHA_BASE_DEBUG_H_
|
| -
|
| -// To create a release build with asserts turned on, uncomment the
|
| -// following line, and uncomment the linking with atls.lib in api.
|
| -//
|
| -// #define ASSERT_IN_RELEASE
|
| -
|
| -#include "omaha/base/atlassert.h"
|
| -#include "omaha/base/synchronized.h"
|
| -#include "omaha/base/time.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// hash table for counts of the number of times REPORTs occur
|
| -// template<class K, class V>
|
| -// class HashTable;
|
| -// extern HashTable<uint32, uint16> *g_reports;
|
| -
|
| -#define kMaxUniqueReports (20)
|
| -#define kMaxReportCountString (20)
|
| -
|
| -class ReportIds;
|
| -extern ReportIds g_report_ids;
|
| -extern volatile LONG g_debugassertrecursioncheck;
|
| -extern bool g_always_assert;
|
| -
|
| -const int kMaxStackTraceDialogLen = 512; // too long and dialog box fails
|
| -
|
| -// TODO(omaha): consider merging this into DebugObserver.
|
| -//
|
| -// For automated testing, we don't (always) want asserts to fire. So
|
| -// we allow the unit test system to handle asserts instead.
|
| -//
|
| -// Give a function matching the prototype to REPLACE_ASSERT_FUNCTION to
|
| -// have your function called instead of the normal assert function.
|
| -typedef int DebugAssertFunctionType(const char *expression,
|
| - const char *message, const char *file, int line);
|
| -
|
| -enum ReportType;
|
| -enum DebugReportKind;
|
| -class DebugObserver {
|
| - public:
|
| - virtual ~DebugObserver() {}
|
| - virtual int SehSendMinidump(unsigned int code, struct _EXCEPTION_POINTERS *ep,
|
| - time64 time_between_minidumps) = 0;
|
| -
|
| -#if defined(_DEBUG) || defined(ASSERT_IN_RELEASE)
|
| - virtual void OnAssert(const char *expr, const TCHAR *msg,
|
| - const char *filename, int32 linenumber) = 0;
|
| -#endif
|
| -
|
| -#if defined(_DEBUG)
|
| - virtual void SendExceptionReport(const TCHAR *log_file, const TCHAR *filename,
|
| - int line, const TCHAR *type, uint32 id,
|
| - bool offline) = 0;
|
| - virtual CString OnDebugReport(uint32 id, bool is_report, ReportType type,
|
| - const char *expr, const TCHAR *message,
|
| - const char *filename, int32 linenumber,
|
| - DebugReportKind debug_report_kind) = 0;
|
| -#endif
|
| -};
|
| -
|
| -// replaces the debug observer, returns the previous value.
|
| -DebugObserver* SetDebugObserver(DebugObserver* observer);
|
| -DebugObserver* PeekDebugObserver();
|
| -
|
| -#ifdef __cplusplus
|
| -extern "C" {
|
| -#endif
|
| -
|
| -int SehSendMinidump(unsigned int code,
|
| - struct _EXCEPTION_POINTERS *ep,
|
| - time64 time_between_minidumps);
|
| -
|
| -#define kMinReportInterval100ns (60 * kSecsTo100ns)
|
| -#define kMinStackReportInterval100ns (60 * kSecsTo100ns)
|
| -#define DEBUG_LOG_SEPARATOR_CHAR "-------------------------------------------\n"
|
| -#define DEBUG_LOG_SEPARATOR L"-------------------------------------------\n"
|
| -#define kExceptionReportHeaders L"Content-Type: binary"
|
| -
|
| -#undef ASSERT
|
| -#undef VERIFY
|
| -#undef TRACE
|
| -
|
| -// Holds information about REPORTS and their frequency
|
| -struct ReportData {
|
| - uint32 report_counts_num;
|
| - uint32 report_ids[kMaxUniqueReports];
|
| - uint16 report_counts[kMaxUniqueReports];
|
| -};
|
| -
|
| -// Used to hold REPORT IDs and to back them to the registry, where they'll be
|
| -// read and sent in a ping.
|
| -class ReportIds : public GLock {
|
| - public:
|
| - ReportIds();
|
| - ~ReportIds();
|
| -
|
| - // Call this after a successful ping to clear the report IDs from the registry
|
| - // and from this component (TRS).
|
| - void ResetReportsAfterPing();
|
| -
|
| - // Adds a report ID to our list, if there's enough space.
|
| - bool ReleaseReport(uint32 id);
|
| -
|
| - // Creates a string with the report IDs and their frequency.
|
| - // Caller deletes string.
|
| - TCHAR *DebugReportString();
|
| -
|
| - private:
|
| - ReportData data_;
|
| -
|
| - // Merges the report data from data2 with data1.
|
| - void MergeReports(ReportData *data1, const ReportData *data2);
|
| -
|
| - // We have to use RegKey directly, because we can't depend on the global
|
| - // Config object during destruction.
|
| - bool LoadReportData(ReportData **data);
|
| - void SaveReportData(ReportData *data);
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(ReportIds);
|
| -};
|
| -
|
| -#if defined(_DEBUG) || defined(ASSERT_IN_RELEASE)
|
| - // Replaces the debug assert function; returns the old value.
|
| - DebugAssertFunctionType *ReplaceDebugAssertFunction(DebugAssertFunctionType
|
| - *replacement);
|
| - #define REPLACE_ASSERT_FUNCTION(replacement) \
|
| - ReplaceDebugAssertFunction(replacement)
|
| -#else
|
| - #define REPLACE_ASSERT_FUNCTION(replacement) NULL
|
| -#endif
|
| -
|
| -#ifdef _DEBUG
|
| - void SendExceptionReport(const TCHAR *log_file,
|
| - const TCHAR *filename,
|
| - int line,
|
| - const TCHAR *type,
|
| - uint32 id,
|
| - bool offline);
|
| -
|
| - void SendStackTrace(const TCHAR *filename,
|
| - int line,
|
| - const TCHAR *type,
|
| - bool all_threads,
|
| - uint32 id);
|
| -
|
| - // DEBUG MODE
|
| -
|
| - extern bool g_LSPMode;
|
| -
|
| - bool DebugReport(unsigned int id,
|
| - ReportType type,
|
| - const char *expr,
|
| - const TCHAR *message,
|
| - const char *filename,
|
| - int linenumber,
|
| - DebugReportKind debug_report_kind);
|
| -
|
| - #define VERIFY(expr, msg) ASSERT(expr, msg) // VERIFY is ASSERT
|
| -
|
| - #define ASSERT(expr, msg) \
|
| - do { \
|
| - ((expr) ? 0 : omaha::DebugReport(0, omaha::R_FATAL, #expr, \
|
| - omaha::SPRINTF msg, __FILE__, __LINE__, omaha::DEBUGREPORT_ASSERT)); \
|
| - } while (0)
|
| -
|
| - #define REPORT(expr, type, msg, id) \
|
| - ((expr) ? 0 : omaha::DebugReport(id, \
|
| - type, \
|
| - #expr, \
|
| - omaha::SPRINTF msg, \
|
| - __FILE__, \
|
| - __LINE__, \
|
| - omaha::DEBUGREPORT_REPORT))
|
| - void DebugAbort(const TCHAR* msg,
|
| - const char* filename,
|
| - int32 linenumber,
|
| - bool do_abort);
|
| - #define ABORT(msg) \
|
| - omaha::DebugAbort(omaha::SPRINTF msg, __FILE__, __LINE__, true)
|
| -
|
| - void TraceError(DWORD error);
|
| - inline void TraceLastError() { TraceError(GetLastError()); }
|
| -
|
| - /**
|
| - * Iterates through HKEY_CLASSES_ROOT\Interface and calls QI for
|
| - * all the interfaces there. Useful for finding out what type of
|
| - * object you're dealing with :-)
|
| - */
|
| - void DumpInterface(IUnknown* unknown);
|
| -
|
| -#else // #ifdef _DEBUG
|
| -
|
| - #ifdef ASSERT_IN_RELEASE
|
| - bool ReleaseAssert(const char *expr,
|
| - const TCHAR *msg,
|
| - const char *filename,
|
| - int32 linenumber);
|
| - #define ASSERT(expr, msg) \
|
| - ((expr) ? 0 : ReleaseAssert(#expr, SPRINTF msg, __FILE__, __LINE__))
|
| - #else
|
| - #define ASSERT(expr, msg) 0
|
| - #endif
|
| -
|
| - // VERIFY executes but does not check expression
|
| - #define VERIFY(expr, msg) \
|
| - do { \
|
| - (expr); \
|
| - } while (0)
|
| - #define REPORT(expr, type, msg, id) \
|
| - ((expr) ? 0 : g_report_ids.ReleaseReport(id))
|
| - void ReleaseAbort(const TCHAR* msg,
|
| - const char* filename,
|
| - int32 linenumber,
|
| - bool do_abort);
|
| - #define ABORT(msg) ReleaseAbort(SPRINTF msg, __FILE__, __LINE__, true)
|
| -
|
| -#endif // #ifdef _DEBUG
|
| -
|
| -#define ASSERT1(expr) ASSERT(expr, (_T("")))
|
| -#define VERIFY1(expr) VERIFY(expr, (_T("")))
|
| -
|
| -#ifdef __cplusplus
|
| -} // extern "C"{
|
| -#endif
|
| -
|
| -#ifdef _DEBUG
|
| -void ShowAssertDialog(const TCHAR *message, const TCHAR *title);
|
| -
|
| -// used to automatically dump the global summary of reports when the
|
| -// program exits
|
| -class ReportSummaryGenerator {
|
| - public:
|
| - ReportSummaryGenerator() {}
|
| - // calls DumpReportSummary()
|
| - ~ReportSummaryGenerator();
|
| - // some programs exit without calling destructors, they can use this function
|
| - // to dump the report summary
|
| - void DumpReportSummary();
|
| - // get text summary of reports
|
| - // caller is responsible for deleting the string returned
|
| - TCHAR *GetReportSummary();
|
| - DISALLOW_EVIL_CONSTRUCTORS(ReportSummaryGenerator);
|
| -};
|
| -
|
| -extern ReportSummaryGenerator g_report_summary_generator;
|
| -#endif
|
| -
|
| -// return string from format+arglist; for debugging; not thread-safe
|
| -TCHAR * __cdecl SPRINTF(const TCHAR * format, ...);
|
| -bool DebugError(const char * expr,
|
| - const TCHAR * message,
|
| - const char * filename,
|
| - INT linenumber,
|
| - BOOL report_only);
|
| -
|
| -// shows an error dialog in DEBUG and when g_release_debug is true
|
| -//
|
| -// example usage:
|
| -//
|
| -// __try {
|
| -// do something that sometimes causes a known exception (e.g.,
|
| -// calling third party code)
|
| -// } __except(SehNoMinidump(GetExceptionCode(), GetExceptionInformation(),
|
| -// __FILE__, __LINE__)) {
|
| -// REPORT(false, R_ERROR, (L"exception doing something"), 103178920);
|
| -// }
|
| -// show_message - show an error dialog in DEBUG and when g_release_debug is true
|
| -int SehNoMinidump(unsigned int code, struct _EXCEPTION_POINTERS *ep,
|
| - const char *filename, int32 linenumber, bool show_message);
|
| -
|
| -/**
|
| -* @return Always returns an error value. If GetLastError is not ERROR_SUCCESS
|
| -* the function returns an HRESULT value derived from GetLastError()
|
| -*/
|
| -inline HRESULT GetCurError() {
|
| - return ::GetLastError() == ERROR_SUCCESS ?
|
| - E_FAIL : HRESULT_FROM_WIN32(::GetLastError());
|
| -}
|
| -
|
| -// Returns the directory where the debugging module stores debug-related files.
|
| -CString GetDebugDirectory();
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_BASE_DEBUG_H_
|
|
|