exception_handler.h.svn-base
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 349 行 · 第 1/2 页
SVN-BASE
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 + -
显示快捷键?