// 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. // // Framework to provide a simple C API to crash reporting for // applications. By default, if any machine-level exception (e.g., // EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef // object as follows: // // 1. Create a minidump file (see Breakpad for details) // 2. Prompt the user (using CFUserNotification) // 3. Invoke a command line reporting tool to send the minidump to a // server // // By specifying parameters to the BreakpadCreate function, you can // modify the default behavior to suit your needs and wants and // desires. // A service name associated with the original bootstrap parent port, saved in // OnDemandServer and restored in Inspector. #define BREAKPAD_BOOTSTRAP_PARENT_PORT "com.Breakpad.BootstrapParent" typedef void *BreakpadRef; #ifdef __cplusplus extern "C" { #endif #include <CoreFoundation/CoreFoundation.h> #include <Foundation/Foundation.h> #include "BreakpadDefines.h" // Optional user-defined function to dec to decide if we should handle // this crash or forward it along. // Return true if you want Breakpad to handle it. // Return false if you want Breakpad to skip it // The exception handler always returns false, as if SEND_AND_EXIT were false // (which means the next exception handler will take the exception) typedef bool (*BreakpadFilterCallback)(int exception_type, int exception_code, mach_port_t crashing_thread, void *context); // Create a new BreakpadRef object and install it as an exception // handler. The |parameters| will typically be the contents of your // bundle's Info.plist. // // You can also specify these additional keys for customizable behavior: // Key: Value: // BREAKPAD_PRODUCT Product name (e.g., "MyAwesomeProduct") // This one is used as the key to identify // the product when uploading. Falls back to // CFBundleName if not specified. // REQUIRED // // BREAKPAD_PRODUCT_DISPLAY This is the display name, e.g. a pretty // name for the product when the crash_sender // pops up UI for the user. Falls back first to // CFBundleDisplayName and then to // BREAKPAD_PRODUCT if not specified. // // BREAKPAD_VERSION Product version (e.g., 1.2.3), used // as metadata for crash report. Falls back to // CFBundleVersion if not specified. // REQUIRED // // BREAKPAD_VENDOR Vendor name, used in UI (e.g. "A report has // been created that you can send to <vendor>") // // BREAKPAD_URL URL destination for reporting // REQUIRED // // BREAKPAD_REPORT_INTERVAL # of seconds between sending // reports. If an additional report is // generated within this time, it will // be ignored. Default: 3600sec. // Specify 0 to send all reports. // // BREAKPAD_SKIP_CONFIRM If true, the reporter will send the report // without any user intervention. // Defaults to NO // // BREAKPAD_CONFIRM_TIMEOUT Number of seconds before the upload // confirmation dialog will be automatically // dismissed (cancelling the upload). // Default: 300 seconds (min of 60). // Specify 0 to prevent timeout. // // BREAKPAD_SEND_AND_EXIT If true, the handler will exit after sending. // This will prevent any other handler (e.g., // CrashReporter) from getting the crash. // Defaults TO YES // // BREAKPAD_DUMP_DIRECTORY The directory to store crash-dumps // in. By default, we use // ~/Library/Breakpad/<BREAKPAD_PRODUCT> // The path you specify here is tilde-expanded. // // BREAKPAD_INSPECTOR_LOCATION The full path to the Inspector executable. // Defaults to <Framework resources>/Inspector // // BREAKPAD_REPORTER_EXE_LOCATION The full path to the Reporter/sender // executable. // Default: // <Framework Resources>/crash_report_sender.app // // BREAKPAD_LOGFILES Indicates an array of log file paths that // should be uploaded at crash time. // // BREAKPAD_REQUEST_COMMENTS If true, the message dialog will have a // text box for the user to enter comments. // Default: NO // // BREAKPAD_REQUEST_EMAIL If true and BREAKPAD_REQUEST_COMMENTS is also // true, the message dialog will have a text // box for the user to enter their email address. // Default: NO // // BREAKPAD_SERVER_TYPE A parameter that tells Breakpad how to // rewrite the upload parameters for a specific // server type. The currently valid values are // 'socorro' or 'google'. If you want to add // other types, see the function in // crash_report_sender.m that maps parameters to // URL parameters. Defaults to 'google'. // // BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static // parameters that are uploaded to the // server. The parameters are sent as // is to the crash server. Their // content isn't added to the minidump // but pass as URL parameters when // uploading theminidump to the crash // server. // // BREAKPAD_IN_PROCESS A boolean NSNumber value. If YES, Breakpad // will write the dump file in-process and then // launch the reporter executable as a child // process. //============================================================================= // The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are // required to have non-NULL values. By default, the BREAKPAD_PRODUCT // will be the CFBundleName and the BREAKPAD_VERSION will be the // CFBundleVersion when these keys are present in the bundle's // Info.plist, which is usually passed in to BreakpadCreate() as an // NSDictionary (you could also pass in another dictionary that had // the same keys configured). If the BREAKPAD_PRODUCT or // BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will // fail. You have been warned. // // If you are running in a debugger, Breakpad will not install, unless the // BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero. // // The BREAKPAD_SKIP_CONFIRM and BREAKPAD_SEND_AND_EXIT default // values are NO and YES. However, they can be controlled by setting their // values in a user or global plist. // // It's easiest to use Breakpad via the Framework, but if you're compiling the // code in directly, BREAKPAD_INSPECTOR_LOCATION and // BREAKPAD_REPORTER_EXE_LOCATION allow you to specify custom paths // to the helper executables. // //============================================================================= // The following are NOT user-supplied but are documented here for // completeness. They are calculated by Breakpad during initialization & // crash-dump generation, or entered in by the user. // // BREAKPAD_PROCESS_START_TIME The time, in seconds since the Epoch, the // process started // // BREAKPAD_PROCESS_CRASH_TIME The time, in seconds since the Epoch, the // process crashed. // // BREAKPAD_PROCESS_UP_TIME The total time in milliseconds the process // has been running. This parameter is not // set until the crash-dump-generation phase. // // BREAKPAD_LOGFILE_KEY_PREFIX Used to find out which parameters in the // parameter dictionary correspond to log // file paths. // // BREAKPAD_SERVER_PARAMETER_PREFIX This prefix is used by Breakpad // internally, because Breakpad uses // the same dictionary internally to // track both its internal // configuration parameters and // parameters meant to be uploaded // to the server. This string is // used internally by Breakpad to // prefix user-supplied parameter // names so those can be sent to the // server without leaking Breakpad's // internal values. // // BREAKPAD_ON_DEMAND Used internally to indicate to the // Reporter that we're sending on-demand, // not as result of a crash. // // BREAKPAD_COMMENTS The text the user provided as comments. // Only used in crash_report_sender. // Returns a new BreakpadRef object on success, NULL otherwise. BreakpadRef BreakpadCreate(NSDictionary *parameters); // Uninstall and release the data associated with |ref|. void BreakpadRelease(BreakpadRef ref); // Clients may set an optional callback which gets called when a crash // occurs. The callback function should return |true| if we should // handle the crash, generate a crash report, etc. or |false| if we // should ignore it and forward the crash (normally to CrashReporter). // Context is a pointer to arbitrary data to make the callback with. void BreakpadSetFilterCallback(BreakpadRef ref, BreakpadFilterCallback callback, void *context); // User defined key and value string storage. Generally this is used // to configure Breakpad's internal operation, such as whether the // crash_sender should prompt the user, or the filesystem location for // the minidump file. See Breakpad.h for some parameters that can be // set. Anything longer than 255 bytes will be truncated. Note that // the string is converted to UTF8 before truncation, so any multibyte // character that straddles the 255(256 - 1 for terminator) byte limit // will be mangled. // // A maximum number of 64 key/value pairs are supported. An assert() // will fire if more than this number are set. Unfortunately, right // now, the same dictionary is used for both Breakpad's parameters AND // the Upload parameters. // // TODO (nealsid): Investigate how necessary this is if we don't // automatically upload parameters to the server anymore. // TODO (nealsid): separate server parameter dictionary from the // dictionary used to configure Breakpad, and document limits for each // independently. void BreakpadSetKeyValue(BreakpadRef ref, NSString *key, NSString *value); NSString *BreakpadKeyValue(BreakpadRef ref, NSString *key); void BreakpadRemoveKeyValue(BreakpadRef ref, NSString *key); // You can use this method to specify parameters that will be uploaded // to the crash server. They will be automatically encoded as // necessary. Note that as mentioned above there are limits on both // the number of keys and their length. void BreakpadAddUploadParameter(BreakpadRef ref, NSString *key, NSString *value); // This method will remove a previously-added parameter from the // upload parameter set. void BreakpadRemoveUploadParameter(BreakpadRef ref, NSString *key); // Add a log file for Breakpad to read and send upon crash dump void BreakpadAddLogFile(BreakpadRef ref, NSString *logPathname); // Generate a minidump and send void BreakpadGenerateAndSendReport(BreakpadRef ref); #ifdef __cplusplus } #endif