exception_handler.h

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· C头文件 代码 · 共 349 行 · 第 1/2 页

H
349
字号
// Copyright (c) 2006, Google Inc.// All rights reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.//     * Neither the name of Google Inc. nor the names of its// contributors may be used to endorse or promote products derived from// this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.// ExceptionHandler can write a minidump file when an exception occurs,// or when WriteMinidump() is called explicitly by your program.//// To have the exception handler write minidumps when an uncaught exception// (crash) occurs, you should create an instance early in the execution// of your program, and keep it around for the entire time you want to// have crash handling active (typically, until shutdown).//// If you want to write minidumps without installing the exception handler,// you can create an ExceptionHandler with install_handler set to false,// then call WriteMinidump.  You can also use this technique if you want to// use different minidump callbacks for different call sites.//// In either case, a callback function is called when a minidump is written,// which receives the unqiue id of the minidump.  The caller can use this// id to collect and write additional application state, and to launch an// external crash-reporting application.//// It is important that creation and destruction of ExceptionHandler objects// be nested cleanly, when using install_handler = true.// Avoid the following pattern://   ExceptionHandler *e = new ExceptionHandler(...);//   ExceptionHandler *f = new ExceptionHandler(...);//   delete e;// This will put the exception filter stack into an inconsistent state.//// To use this library in your project, you will need to link against// ole32.lib.#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__#include <stdlib.h>#include <Windows.h>#include <DbgHelp.h>#pragma warning( push )// Disable exception handler warnings.#pragma warning( disable : 4530 ) #include <string>#include <vector>#include "google_breakpad/common/minidump_format.h"namespace google_breakpad {using std::vector;using std::wstring;class ExceptionHandler { public:  // A callback function to run before Breakpad performs any substantial  // processing of an exception.  A FilterCallback is called before writing  // a minidump.  context is the parameter supplied by the user as  // callback_context when the handler was created.  exinfo points to the  // exception record, if any; assertion points to assertion information,  // if any.  //  // If a FilterCallback returns true, Breakpad will continue processing,  // attempting to write a minidump.  If a FilterCallback returns false, Breakpad  // will immediately report the exception as unhandled without writing a  // minidump, allowing another handler the opportunity to handle it.  typedef bool (*FilterCallback)(void *context, EXCEPTION_POINTERS *exinfo,                                 MDRawAssertionInfo *assertion);  // A callback function to run after the minidump has been written.  // minidump_id is a unique id for the dump, so the minidump  // file is <dump_path>\<minidump_id>.dmp.  context is the parameter supplied  // by the user as callback_context when the handler was created.  exinfo  // points to the exception record, or NULL if no exception occurred.  // succeeded indicates whether a minidump file was successfully written.  // assertion points to information about an assertion if the handler was  // invoked by an assertion.  //  // If an exception occurred and the callback returns true, Breakpad will treat  // the exception as fully-handled, suppressing any other handlers from being  // notified of the exception.  If the callback returns false, Breakpad will  // treat the exception as unhandled, and allow another handler to handle it.  // If there are no other handlers, Breakpad will report the exception to the  // system as unhandled, allowing a debugger or native crash dialog the  // opportunity to handle the exception.  Most callback implementations  // should normally return the value of |succeeded|, or when they wish to  // not report an exception of handled, false.  Callbacks will rarely want to  // return true directly (unless |succeeded| is true).  typedef bool (*MinidumpCallback)(const wchar_t *dump_path,                                   const wchar_t *minidump_id,                                   void *context,                                   EXCEPTION_POINTERS *exinfo,                                   MDRawAssertionInfo *assertion,                                   bool succeeded);  // HandlerType specifies which types of handlers should be installed, if  // any.  Use HANDLER_NONE for an ExceptionHandler that remains idle,  // without catching any failures on its own.  This type of handler may  // still be triggered by calling WriteMinidump.  Otherwise, use a  // combination of the other HANDLER_ values, or HANDLER_ALL to install  // all handlers.  enum HandlerType {    HANDLER_NONE = 0,    HANDLER_EXCEPTION = 1 << 0,          // SetUnhandledExceptionFilter    HANDLER_INVALID_PARAMETER = 1 << 1,  // _set_invalid_parameter_handler    HANDLER_PURECALL = 1 << 2,           // _set_purecall_handler    HANDLER_ALL = HANDLER_EXCEPTION |                  HANDLER_INVALID_PARAMETER |                  HANDLER_PURECALL  };  // Creates a new ExceptionHandler instance to handle writing minidumps.  // Before writing a minidump, the optional filter callback will be called.  // Its return value determines whether or not Breakpad should write a  // minidump.  Minidump files will be written to dump_path, and the optional  // callback is called after writing the dump file, as described above.  // handler_types specifies the types of handlers that should be installed.  ExceptionHandler(const wstring &dump_path,                   FilterCallback filter,                   MinidumpCallback callback,                   void *callback_context,                   int handler_types);  ~ExceptionHandler();  // Get and set the minidump path.  wstring dump_path() const { return dump_path_; }  void set_dump_path(const wstring &dump_path) {    dump_path_ = dump_path;    dump_path_c_ = dump_path_.c_str();    UpdateNextID();  // Necessary to put dump_path_ in next_minidump_path_.  }  // Writes a minidump immediately.  This can be used to capture the  // execution state independently of a crash.  Returns true on success.  bool WriteMinidump();  // Writes a minidump immediately, with the user-supplied exception  // information.  bool WriteMinidumpForException(EXCEPTION_POINTERS *exinfo);  // Convenience form of WriteMinidump which does not require an  // ExceptionHandler instance.  static bool WriteMinidump(const wstring &dump_path,                            MinidumpCallback callback, void *callback_context); private:  friend class AutoExceptionHandler;  // Function pointer type for MiniDumpWriteDump, which is looked up

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?