Johan Mattsson
Johan Mattsson

Reputation: 345

How do I integrate google crashpad with my application?

The breakpad project will be replaced by the google crashpad project. How do I integrate the new crash reporter with my application on Mac?

Upvotes: 5

Views: 5256

Answers (2)

bobbyg603
bobbyg603

Reputation: 3850

First, configure depot_tools to build Crashpad.

Next, acquire a copy of the Crashpad source.

Build Crashpad with gn and ninja, where gn generates a build configuration, and ninja does the actual building. Full instructions on how to build Crashpad are available here.

For MacOS, you will need to link against libclient.a, libutil.a, libbase.a, libcommon.a, and libmig_output.a if you want to generate minidumps and upload them to a remote server. Additionally, you'll need to package crashpad_handler with your application and ensure it is available at runtime.

Integrate Crashpad with your application by configuring the Crashpad handler and point it at a server capable of ingesting Crashpad crash reports.

#include "client/crashpad_client.h"
#include "client/crash_report_database.h"
#include "client/settings.h"

#if defined(OS_POSIX)
typedef std::string StringType;
#elif defined(OS_WIN)
typedef std::wstring StringType;
#endif

using namespace base;
using namespace crashpad;
using namespace std;

bool initializeCrashpad(void);
StringType getExecutableDir(void);

bool initializeCrashpad() {
  // Get directory where the exe lives so we can pass a full path to handler, reportsDir and metricsDir
  StringType exeDir = getExecutableDir();
  
  // Ensure that handler is shipped with your application
  FilePath handler(exeDir + "/path/to/crashpad_handler");
  
  // Directory where reports will be saved. Important! Must be writable or crashpad_handler will crash.
  FilePath reportsDir(exeDir + "/path/to/crashpad");
  
  // Directory where metrics will be saved. Important! Must be writable or crashpad_handler will crash.
  FilePath metricsDir(exeDir + "/path/to/crashpad");
  
  // Configure url with BugSplat’s public fred database. Replace 'fred' with the name of your BugSplat database.
  StringType url = "https://fred.bugsplat.com/post/bp/crash/crashpad.php";
  
  // Metadata that will be posted to the server with the crash report map
  map<StringType, StringType> annotations;
  annotations["format"] = "minidump";          // Required: Crashpad setting to save crash as a minidump
  annotations["product"] = "myCrashpadCrasher" // Required: BugSplat appName
  annotations["version"] = "1.0.0";            // Required: BugSplat appVersion
  annotations["key"] = "Sample key";           // Optional: BugSplat key field
  annotations["user"] = "fred@bugsplat.com";   // Optional: BugSplat user email
  annotations["list_annotations"] = "Sample comment"; // Optional: BugSplat crash description
  
  // Disable crashpad rate limiting so that all crashes have dmp files
  vector<StringType> arguments; 
  arguments.push_back("--no-rate-limit");
  
  // Initialize Crashpad database
  unique_ptr<CrashReportDatabase> database = CrashReportDatabase::Initialize(reportsDir);
  if (database == NULL) return false;
  
  // Enable automated crash uploads
  Settings *settings = database->GetSettings();
  if (settings == NULL) return false;
  settings->SetUploadsEnabled(true);
  
  // Start crash handler
  CrashpadClient *client = new CrashpadClient();
  bool status = client->StartHandler(handler, reportsDir, metricsDir, url, annotations, arguments, true, true);
  return status;
}

You'll also need to generate sym files using dump_syms. You can upload sym files to a remote server using symupload. Finally, you can symbolicate the minidump using minidump_stackwalk.

Upvotes: 11

Stoff81
Stoff81

Reputation: 627

I have just got word from one of the devs that its not ready yet...https://groups.google.com/a/chromium.org/forum/#!topic/crashpad-dev/GbS_HcsYzbQ

Upvotes: 0

Related Questions