1*9712c20fSFrederick Mayle // Copyright 2011 Google LLC 2*9712c20fSFrederick Mayle // 3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without 4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are 5*9712c20fSFrederick Mayle // met: 6*9712c20fSFrederick Mayle // 7*9712c20fSFrederick Mayle // * Redistributions of source code must retain the above copyright 8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer. 9*9712c20fSFrederick Mayle // * Redistributions in binary form must reproduce the above 10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer 11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the 12*9712c20fSFrederick Mayle // distribution. 13*9712c20fSFrederick Mayle // * Neither the name of Google LLC nor the names of its 14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from 15*9712c20fSFrederick Mayle // this software without specific prior written permission. 16*9712c20fSFrederick Mayle // 17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*9712c20fSFrederick Mayle 29*9712c20fSFrederick Mayle // Framework to provide a simple C API to crash reporting for 30*9712c20fSFrederick Mayle // applications. By default, if any machine-level exception (e.g., 31*9712c20fSFrederick Mayle // EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef 32*9712c20fSFrederick Mayle // object as follows: 33*9712c20fSFrederick Mayle // 34*9712c20fSFrederick Mayle // 1. Create a minidump file (see Breakpad for details) 35*9712c20fSFrederick Mayle // 2. Create a config file. 36*9712c20fSFrederick Mayle // 37*9712c20fSFrederick Mayle // These files can then be uploaded to a server. 38*9712c20fSFrederick Mayle 39*9712c20fSFrederick Mayle typedef void* BreakpadRef; 40*9712c20fSFrederick Mayle 41*9712c20fSFrederick Mayle #ifdef __cplusplus 42*9712c20fSFrederick Mayle extern "C" { 43*9712c20fSFrederick Mayle #endif 44*9712c20fSFrederick Mayle 45*9712c20fSFrederick Mayle #include <Foundation/Foundation.h> 46*9712c20fSFrederick Mayle 47*9712c20fSFrederick Mayle #include <client/apple/Framework/BreakpadDefines.h> 48*9712c20fSFrederick Mayle 49*9712c20fSFrederick Mayle // The keys in the dictionary returned by |BreakpadGenerateReport|. 50*9712c20fSFrederick Mayle #define BREAKPAD_OUTPUT_DUMP_FILE "BreakpadDumpFile" 51*9712c20fSFrederick Mayle #define BREAKPAD_OUTPUT_CONFIG_FILE "BreakpadConfigFile" 52*9712c20fSFrederick Mayle 53*9712c20fSFrederick Mayle // Optional user-defined function to decide if we should handle this crash or 54*9712c20fSFrederick Mayle // forward it along. 55*9712c20fSFrederick Mayle // Return true if you want Breakpad to handle it. 56*9712c20fSFrederick Mayle // Return false if you want Breakpad to skip it 57*9712c20fSFrederick Mayle // The exception handler always returns false, as if SEND_AND_EXIT were false 58*9712c20fSFrederick Mayle // (which means the next exception handler will take the exception) 59*9712c20fSFrederick Mayle typedef bool (*BreakpadFilterCallback)(int exception_type, 60*9712c20fSFrederick Mayle int exception_code, 61*9712c20fSFrederick Mayle mach_port_t crashing_thread, 62*9712c20fSFrederick Mayle void* context); 63*9712c20fSFrederick Mayle 64*9712c20fSFrederick Mayle // Optional user-defined function that will be called after a network upload 65*9712c20fSFrederick Mayle // of a crash report. 66*9712c20fSFrederick Mayle // |report_id| will be the id returned by the server, or "ERR" if an error 67*9712c20fSFrederick Mayle // occurred. 68*9712c20fSFrederick Mayle // |error| will contain the error, or nil if no error occured. 69*9712c20fSFrederick Mayle typedef void (*BreakpadUploadCompletionCallback)(NSString* report_id, 70*9712c20fSFrederick Mayle NSError* error); 71*9712c20fSFrederick Mayle 72*9712c20fSFrederick Mayle // Create a new BreakpadRef object and install it as an exception 73*9712c20fSFrederick Mayle // handler. The |parameters| will typically be the contents of your 74*9712c20fSFrederick Mayle // bundle's Info.plist. 75*9712c20fSFrederick Mayle // 76*9712c20fSFrederick Mayle // You can also specify these additional keys for customizable behavior: 77*9712c20fSFrederick Mayle // Key: Value: 78*9712c20fSFrederick Mayle // BREAKPAD_PRODUCT Product name (e.g., "MyAwesomeProduct") 79*9712c20fSFrederick Mayle // This one is used as the key to identify 80*9712c20fSFrederick Mayle // the product when uploading. Falls back to 81*9712c20fSFrederick Mayle // CFBundleName if not specified. 82*9712c20fSFrederick Mayle // REQUIRED 83*9712c20fSFrederick Mayle // 84*9712c20fSFrederick Mayle // BREAKPAD_PRODUCT_DISPLAY This is the display name, e.g. a pretty 85*9712c20fSFrederick Mayle // name for the product when the crash_sender 86*9712c20fSFrederick Mayle // pops up UI for the user. Falls back first to 87*9712c20fSFrederick Mayle // CFBundleDisplayName and then to 88*9712c20fSFrederick Mayle // BREAKPAD_PRODUCT if not specified. 89*9712c20fSFrederick Mayle // 90*9712c20fSFrederick Mayle // BREAKPAD_VERSION Product version (e.g., 1.2.3), used 91*9712c20fSFrederick Mayle // as metadata for crash report. Falls back to 92*9712c20fSFrederick Mayle // CFBundleVersion if not specified. 93*9712c20fSFrederick Mayle // REQUIRED 94*9712c20fSFrederick Mayle // 95*9712c20fSFrederick Mayle // BREAKPAD_VENDOR Vendor name, used in UI (e.g. "A report has 96*9712c20fSFrederick Mayle // been created that you can send to <vendor>") 97*9712c20fSFrederick Mayle // 98*9712c20fSFrederick Mayle // BREAKPAD_URL URL destination for reporting 99*9712c20fSFrederick Mayle // REQUIRED 100*9712c20fSFrederick Mayle // 101*9712c20fSFrederick Mayle // BREAKPAD_DUMP_DIRECTORY The directory to store crash-dumps 102*9712c20fSFrederick Mayle // in. By default, we use 103*9712c20fSFrederick Mayle // ~/Library/Cache/Breakpad/<BREAKPAD_PRODUCT> 104*9712c20fSFrederick Mayle // The path you specify here is tilde-expanded. 105*9712c20fSFrederick Mayle // 106*9712c20fSFrederick Mayle // BREAKPAD_SERVER_TYPE A parameter that tells Breakpad how to 107*9712c20fSFrederick Mayle // rewrite the upload parameters for a specific 108*9712c20fSFrederick Mayle // server type. The currently valid values are 109*9712c20fSFrederick Mayle // 'socorro' or 'google'. If you want to add 110*9712c20fSFrederick Mayle // other types, see the function in 111*9712c20fSFrederick Mayle // crash_report_sender.m that maps parameters to 112*9712c20fSFrederick Mayle // URL parameters. Defaults to 'google'. 113*9712c20fSFrederick Mayle // 114*9712c20fSFrederick Mayle // BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static 115*9712c20fSFrederick Mayle // parameters that are uploaded to the 116*9712c20fSFrederick Mayle // server. The parameters are sent as 117*9712c20fSFrederick Mayle // is to the crash server. Their 118*9712c20fSFrederick Mayle // content isn't added to the minidump 119*9712c20fSFrederick Mayle // but pass as URL parameters when 120*9712c20fSFrederick Mayle // uploading theminidump to the crash 121*9712c20fSFrederick Mayle // server. 122*9712c20fSFrederick Mayle //============================================================================= 123*9712c20fSFrederick Mayle // The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are 124*9712c20fSFrederick Mayle // required to have non-NULL values. By default, the BREAKPAD_PRODUCT 125*9712c20fSFrederick Mayle // will be the CFBundleName and the BREAKPAD_VERSION will be the 126*9712c20fSFrederick Mayle // CFBundleVersion when these keys are present in the bundle's 127*9712c20fSFrederick Mayle // Info.plist, which is usually passed in to BreakpadCreate() as an 128*9712c20fSFrederick Mayle // NSDictionary (you could also pass in another dictionary that had 129*9712c20fSFrederick Mayle // the same keys configured). If the BREAKPAD_PRODUCT or 130*9712c20fSFrederick Mayle // BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will 131*9712c20fSFrederick Mayle // fail. You have been warned. 132*9712c20fSFrederick Mayle // 133*9712c20fSFrederick Mayle // If you are running in a debugger, Breakpad will not install, unless the 134*9712c20fSFrederick Mayle // BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero. 135*9712c20fSFrederick Mayle // 136*9712c20fSFrederick Mayle //============================================================================= 137*9712c20fSFrederick Mayle // The following are NOT user-supplied but are documented here for 138*9712c20fSFrederick Mayle // completeness. They are calculated by Breakpad during initialization & 139*9712c20fSFrederick Mayle // crash-dump generation, or entered in by the user. 140*9712c20fSFrederick Mayle // 141*9712c20fSFrederick Mayle // BREAKPAD_PROCESS_START_TIME The time, in seconds since the Epoch, the 142*9712c20fSFrederick Mayle // process started 143*9712c20fSFrederick Mayle // 144*9712c20fSFrederick Mayle // BREAKPAD_PROCESS_CRASH_TIME The time, in seconds since the Epoch, the 145*9712c20fSFrederick Mayle // process crashed. 146*9712c20fSFrederick Mayle // 147*9712c20fSFrederick Mayle // BREAKPAD_PROCESS_UP_TIME The total time in milliseconds the process 148*9712c20fSFrederick Mayle // has been running. This parameter is not 149*9712c20fSFrederick Mayle // set until the crash-dump-generation phase. 150*9712c20fSFrederick Mayle // 151*9712c20fSFrederick Mayle // BREAKPAD_SERVER_PARAMETER_PREFIX This prefix is used by Breakpad 152*9712c20fSFrederick Mayle // internally, because Breakpad uses 153*9712c20fSFrederick Mayle // the same dictionary internally to 154*9712c20fSFrederick Mayle // track both its internal 155*9712c20fSFrederick Mayle // configuration parameters and 156*9712c20fSFrederick Mayle // parameters meant to be uploaded 157*9712c20fSFrederick Mayle // to the server. This string is 158*9712c20fSFrederick Mayle // used internally by Breakpad to 159*9712c20fSFrederick Mayle // prefix user-supplied parameter 160*9712c20fSFrederick Mayle // names so those can be sent to the 161*9712c20fSFrederick Mayle // server without leaking Breakpad's 162*9712c20fSFrederick Mayle // internal values. 163*9712c20fSFrederick Mayle 164*9712c20fSFrederick Mayle // Returns a new BreakpadRef object on success, NULL otherwise. 165*9712c20fSFrederick Mayle BreakpadRef BreakpadCreate(NSDictionary* parameters); 166*9712c20fSFrederick Mayle 167*9712c20fSFrederick Mayle // Uninstall and release the data associated with |ref|. 168*9712c20fSFrederick Mayle void BreakpadRelease(BreakpadRef ref); 169*9712c20fSFrederick Mayle 170*9712c20fSFrederick Mayle // User defined key and value string storage. Generally this is used 171*9712c20fSFrederick Mayle // to configure Breakpad's internal operation, such as whether the 172*9712c20fSFrederick Mayle // crash_sender should prompt the user, or the filesystem location for 173*9712c20fSFrederick Mayle // the minidump file. See Breakpad.h for some parameters that can be 174*9712c20fSFrederick Mayle // set. Anything longer than 255 bytes will be truncated. Note that 175*9712c20fSFrederick Mayle // the string is converted to UTF8 before truncation, so any multibyte 176*9712c20fSFrederick Mayle // character that straddles the 255(256 - 1 for terminator) byte limit 177*9712c20fSFrederick Mayle // will be mangled. 178*9712c20fSFrederick Mayle // 179*9712c20fSFrederick Mayle // A maximum number of 64 key/value pairs are supported. An assert() 180*9712c20fSFrederick Mayle // will fire if more than this number are set. Unfortunately, right 181*9712c20fSFrederick Mayle // now, the same dictionary is used for both Breakpad's parameters AND 182*9712c20fSFrederick Mayle // the Upload parameters. 183*9712c20fSFrederick Mayle // 184*9712c20fSFrederick Mayle // TODO (nealsid): Investigate how necessary this is if we don't 185*9712c20fSFrederick Mayle // automatically upload parameters to the server anymore. 186*9712c20fSFrederick Mayle // TODO (nealsid): separate server parameter dictionary from the 187*9712c20fSFrederick Mayle // dictionary used to configure Breakpad, and document limits for each 188*9712c20fSFrederick Mayle // independently. 189*9712c20fSFrederick Mayle void BreakpadSetKeyValue(BreakpadRef ref, NSString* key, NSString* value); 190*9712c20fSFrederick Mayle NSString* BreakpadKeyValue(BreakpadRef ref, NSString* key); 191*9712c20fSFrederick Mayle void BreakpadRemoveKeyValue(BreakpadRef ref, NSString* key); 192*9712c20fSFrederick Mayle 193*9712c20fSFrederick Mayle // You can use this method to specify parameters that will be uploaded 194*9712c20fSFrederick Mayle // to the crash server. They will be automatically encoded as 195*9712c20fSFrederick Mayle // necessary. Note that as mentioned above there are limits on both 196*9712c20fSFrederick Mayle // the number of keys and their length. 197*9712c20fSFrederick Mayle void BreakpadAddUploadParameter(BreakpadRef ref, NSString* key, 198*9712c20fSFrederick Mayle NSString* value); 199*9712c20fSFrederick Mayle 200*9712c20fSFrederick Mayle // This method will remove a previously-added parameter from the 201*9712c20fSFrederick Mayle // upload parameter set. 202*9712c20fSFrederick Mayle void BreakpadRemoveUploadParameter(BreakpadRef ref, NSString* key); 203*9712c20fSFrederick Mayle 204*9712c20fSFrederick Mayle // Method to handle uploading data to the server 205*9712c20fSFrederick Mayle 206*9712c20fSFrederick Mayle // Returns the number of crash reports waiting to send to the server. 207*9712c20fSFrederick Mayle int BreakpadGetCrashReportCount(BreakpadRef ref); 208*9712c20fSFrederick Mayle 209*9712c20fSFrederick Mayle // Returns the next upload configuration. The report file is deleted. 210*9712c20fSFrederick Mayle NSDictionary* BreakpadGetNextReportConfiguration(BreakpadRef ref); 211*9712c20fSFrederick Mayle 212*9712c20fSFrederick Mayle // Returns the date of the most recent crash report. 213*9712c20fSFrederick Mayle NSDate* BreakpadGetDateOfMostRecentCrashReport(BreakpadRef ref); 214*9712c20fSFrederick Mayle 215*9712c20fSFrederick Mayle // Upload next report to the server. 216*9712c20fSFrederick Mayle void BreakpadUploadNextReport(BreakpadRef ref); 217*9712c20fSFrederick Mayle 218*9712c20fSFrederick Mayle // Upload next report to the server. 219*9712c20fSFrederick Mayle // |server_parameters| is additional server parameters to send. 220*9712c20fSFrederick Mayle void BreakpadUploadNextReportWithParameters( 221*9712c20fSFrederick Mayle BreakpadRef ref, 222*9712c20fSFrederick Mayle NSDictionary* server_parameters, 223*9712c20fSFrederick Mayle BreakpadUploadCompletionCallback callback); 224*9712c20fSFrederick Mayle 225*9712c20fSFrederick Mayle // Upload a report to the server. 226*9712c20fSFrederick Mayle // |server_parameters| is additional server parameters to send. 227*9712c20fSFrederick Mayle // |configuration| is the configuration of the breakpad report to send. 228*9712c20fSFrederick Mayle void BreakpadUploadReportWithParametersAndConfiguration( 229*9712c20fSFrederick Mayle BreakpadRef ref, 230*9712c20fSFrederick Mayle NSDictionary* server_parameters, 231*9712c20fSFrederick Mayle NSDictionary* configuration, 232*9712c20fSFrederick Mayle BreakpadUploadCompletionCallback callback); 233*9712c20fSFrederick Mayle 234*9712c20fSFrederick Mayle // Handles the network response of a breakpad upload. This function is needed if 235*9712c20fSFrederick Mayle // the actual upload is done by the Breakpad client. 236*9712c20fSFrederick Mayle // |configuration| is the configuration of the upload. It must contain the same 237*9712c20fSFrederick Mayle // fields as the configuration passed to 238*9712c20fSFrederick Mayle // BreakpadUploadReportWithParametersAndConfiguration. 239*9712c20fSFrederick Mayle // |data| and |error| contain the network response. 240*9712c20fSFrederick Mayle void BreakpadHandleNetworkResponse(BreakpadRef ref, 241*9712c20fSFrederick Mayle NSDictionary* configuration, 242*9712c20fSFrederick Mayle NSData* data, 243*9712c20fSFrederick Mayle NSError* error); 244*9712c20fSFrederick Mayle 245*9712c20fSFrederick Mayle // Upload a file to the server. |data| is the content of the file to sent. 246*9712c20fSFrederick Mayle // |server_parameters| is additional server parameters to send. 247*9712c20fSFrederick Mayle void BreakpadUploadData(BreakpadRef ref, NSData* data, NSString* name, 248*9712c20fSFrederick Mayle NSDictionary* server_parameters); 249*9712c20fSFrederick Mayle 250*9712c20fSFrederick Mayle // Generate a breakpad minidump and configuration file in the dump directory. 251*9712c20fSFrederick Mayle // The report will be available for uploading. The paths of the created files 252*9712c20fSFrederick Mayle // are returned in the dictionary. |server_parameters| is additional server 253*9712c20fSFrederick Mayle // parameters to add in the config file. 254*9712c20fSFrederick Mayle NSDictionary* BreakpadGenerateReport(BreakpadRef ref, 255*9712c20fSFrederick Mayle NSDictionary* server_parameters); 256*9712c20fSFrederick Mayle 257*9712c20fSFrederick Mayle #ifdef __cplusplus 258*9712c20fSFrederick Mayle } 259*9712c20fSFrederick Mayle #endif 260