Getting Started with Breakpad
=============================

Run the sample executable crash_generation_app.exe click Menu->Server->Start.
This is now the 'Server'.

Run the executable AGAIN (a second instance). This is now the 'Client'.  You
should see a message like "Client connected" in the Server.  In the Client,
click Menu->Client->Deref Zero

The client should crash, and you should see a message like "Client requested
dump" in the server.

In c:\dumps you now have a .dmp file.  You can inspect that with
minidump_stackwalk or open in it WinDbg.

Integrating BreakPad into your application
==========================================

See https://code.google.com/p/google-breakpad/wiki/WindowsClientIntegration

In your main() function (or equivalent), before your program does any real work,
add the following:

#include <google_breakpad/client/windows/handler/exception_handler.h>

int main() {
   ...

   static wstring prod = get_myapp_name();
   static wstring ver = get_myapp_version();
   static wstring subver = get_myapp_subversion();

   static int google_custom_count = 3;
   static google_breakpad::CustomInfoEntry google_custom_entries[] = {
     google_breakpad::CustomInfoEntry(L"prod", prod.c_str()),
     google_breakpad::CustomInfoEntry(L"ver", ver.c_str()),
     google_breakpad::CustomInfoEntry(L"subver", subver.c_str()),
   };

   google_breakpad::CustomClientInfo custom_info = {google_custom_entries,
     google_custom_count};

   google_breakpad::ExceptionHandler * google_pad = new
     google_breakpad::ExceptionHandler(
       L"C:\\dumps\\", // dump path
       NULL, // filter callback
       NULL, // MinidumpCallback,
       NULL, // callback context
       google_breakpad::ExceptionHandler::HANDLER_ALL, // handler types
       MiniDumpNormal, // or for a larger dump: MiniDumpWithFullMemory
       NULL, // pipe name
       &custom_info); // custom info

    ...
 }

If you define MinidumpCallback, the signature is like so: bool
MinidumpCallback(const wchar_t* dump_path, const wchar_t* minidump_id, void*
context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool
succeeded);

The callback is the point where you could spawn another program that tells the
user that the program has crashed etc.

The above code will generate dumps in the c:\dumps folder.  MAKE SURE the folder
is created first.
