{"id":85,"date":"2014-10-28T23:05:56","date_gmt":"2014-10-28T19:05:56","guid":{"rendered":"http:\/\/zxstudio.org\/blog\/?p=85"},"modified":"2016-05-09T12:17:54","modified_gmt":"2016-05-09T08:17:54","slug":"integrating-google-breakpad","status":"publish","type":"post","link":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/","title":{"rendered":"Integrating Google Breakpad"},"content":{"rendered":"<p>That programs have bugs is a given in modern times. We all make mistakes, and even if we don&#8217;t, we use somebody else&#8217;s code, which may contain errors. When your program crashes on user&#8217;s computer, you should know about it, and that&#8217;s where Crash Reporting comes in. We all have seen it in Windows, MacOS X and even in KDE applications. But what if you want to add such capability to your own project?<\/p>\n<p>As long as you&#8217;re only using mobile platforms like iOS, Android or Windows Phone, you have a rich choice of 3rd-party APIs which allows generation, collection and processing of crash reports. iOS has TestFlight. For a cross-platform applications, you may use HockeyApp SDK or CApptain. But on desktop, your choice is limited.<\/p>\n<p>Actually, I was unable to find any free alternatives to Google&#8217;s <a href=\"https:\/\/chromium.googlesource.com\/breakpad\/breakpad\/\">Breakpad<\/a>. The good news, however, is that Breakpad is a well-tested piece of code (it is used in Mozilla Firefox and some other major software products) and it&#8217;s certainly cross-platform. In fact, not only does it support desktop, but also mobile platforms!<\/p>\n<p>However, its integration is far from straightforward.<\/p>\n<p><!--more--><\/p>\n<h3>1. Getting and compiling Breakpad on Windows<\/h3>\n<p>From what I can see, Breakpad does not offer any ready-made packages on its page. So, your only options is to check out its sources from Google&#8217;s Git via command provided <a href=\"https:\/\/chromium.googlesource.com\/breakpad\/breakpad\/\">here<\/a>. After that, things begin to go slightly wrong. <strike>The documentation says <i>&#8220;Once you build the solution inside src\/client\/windows, an output file of exception_handler.lib will be generated.&#8221;<\/i> However, there is no Visual Studio solution in this directory. You have to generate it using Google&#8217;s alternative to CMake, <a href=\"https:\/\/code.google.com\/p\/gyp\/\">gyp<\/a> (Generate Your Project).<\/p>\n<p>gyp is a Python script, so first be sure to download and install Python 2.7. A copy of gyp source tree is included in Breakpad Git, so you do not need to download it separately. To generate Visual Studio solution, run this string from command line (I&#8217;m assuming you have added %BreakpadFolder%\\src\\tools\\gyp\\ to your path):<br \/>\n<\/strike><\/p>\n<p><b>2015 update:<\/b>Well, Google decided to remove a section on building Breakpad for Windows completely from their documentation. Also, Gyp is no longer included in Breakpad repository (even though it would be much easier to to this with Git and its submoudles system). Still, basic steps remain the same: get Gyp, use Gyp to generate Visual Studio project, use generated project to build Breakpad.<\/p>\n<p>First, you&#8217;ll need to <a href=\"https:\/\/chromium.googlesource.com\/external\/gyp\">check out Gyp<\/a> in a directory somewhere. You&#8217;ll also need a copy of Python 2.7, which could be obtained from the <a href=\"https:\/\/www.python.org\/downloads\/windows\/\">official site<\/a>. Then, assuming that you added Gyp root folder to Path or are using the full path to to batch file, you can use the following command line to generate a Visual Studio project:<\/p>\n<p><b>gyp.bat &#8211;no-circular-check src\\client\\windows\\breakpad_client.gyp -Dwin_release_RuntimeLibrary=2 -Dwin_debug_RuntimeLibrary=2<\/b><\/p>\n<p>If you need to, you can also specify Visual Studio version, for which you want your project to be generated. I did it via environment variable &#8220;set GYP_MSVS_VERSION=2010&#8221;, but I guess you can just pass it throught command line with -DMSVS_VERSION=2010 (I haven&#8217;t tried it, though).<\/p>\n<p>The first switch is necessary to make gyp work at all, since otherwise it will report an error. The second and the third switch is more interesting. In fact, it tells gyp to generate a project which will use &#8220;\\MD&#8221; switch (Multi-Threaded DLL) instead of &#8220;\\MT&#8221; (Multi-Threaded) when choosing CRT version. You may omit this, if you NEED to use static version of CRT, or specify 0 instead of 2.<\/p>\n<p>This will generate \\src\\client\\windows\\breakpad_client.sln and various other files. The project generated by Gyp, however, would not compile by default. It seems like Breakpad&#8217;s maintainers are treating Windows as a second-class platform and do not bother to keep it working. The first thing you will need to do is to disable C\/C++->General->Treat Warnings As Errors for all projects. Otherwise you will get errors in Windows SDK headers. Even after that, some projects still would not compile, because they lack necessary files or are mis-configured, but you should be able to get all you need for following integration steps: common.lib, crash_generation_client.lib, crash_report_sender.lib and exception_handler.lib.<\/p>\n<p>Please note, that despite the fact that gyp is a cross-platform project generator, Breakpad ONLY uses it for generating Windows projects. On all other systems, you can use the usual configure &#038;&#038; make process. This difference makes it harder to integrate Breakpad in a cross-platform product, but oh well&#8230;<\/p>\n<h3>2. Integrating Breakpad with your application<\/h3>\n<p>Google&#8217;s instructions about <a href=\"https:\/\/code.google.com\/p\/google-breakpad\/wiki\/WindowsClientIntegration\">Windows Client Integration<\/a> are perfectly OK in that they tell you what to do with your code. However, Breakpad authors advise to include the whole source tree for Breakpad in your project and build it along with everything else. It seems to me that whoever wrote this was bitten by a radioactive stupid. Breakpad is not a small library, with sprawling source tree, which even includes some binary files. You don&#8217;t need all this trash in your own repository.<\/p>\n<p>However, Breakpad does not make it easy to separate end-user files (libraries and headers) from source files. You will have to do it by hand. Here&#8217;s a list of directories and files that you will need for basic integration (with sending of crash reports to server):<\/p>\n<pre>\r\n|--google_breakpad\r\n   |---processor\r\n   |---common\r\n|--common\r\n   |---windows\r\n|---client\r\n   |---windows\r\n      |---crash_generation\r\n      |---sender\r\n      |---handler\r\n      |---common\r\nexception_handler.h\r\n<\/pre>\n<p>You will also need this libraries:<\/p>\n<pre>\r\ncrash_report_sender.lib\r\ncrash_generation_client.lib\r\ncommon.lib\r\nexception_handler.lib\r\n<\/pre>\n<p>You may want to clean those directories of .cc files and other trash.<\/p>\n<p>Now, to make Breakpad work, in your application you will only need to include <b>exception_handler.h<\/b>, and, if you need to send crash reports to server, <b>client\/windows\/sender\/crash_report_sender.h<\/b>.<\/p>\n<p>Please note, that under other OSes, you will need a slightly different set of files and directories (oh, the pain).<\/p>\n<p>Here, I will repeat a basic process for integrating Breakpad into your code.<\/p>\n<p>First, include <b>exception_handler.h<\/b> and create an instance of google_breakpad::ExceptionHandler:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n  \/\/ Creates a new ExceptionHandler instance to handle writing minidumps.\r\n  \/\/ Before writing a minidump, the optional filter callback will be called.\r\n  \/\/ Its return value determines whether or not Breakpad should write a\r\n  \/\/ minidump.  Minidump files will be written to dump_path, and the optional\r\n  \/\/ callback is called after writing the dump file, as described above.\r\n  \/\/ handler_types specifies the types of handlers that should be installed.\r\n  \r\n    google_breakpad::ExceptionHandler *pHandler = new google_breakpad::ExceptionHandler( \r\n        L&quot;dumps\\\\&quot;, \r\n        DmpFilter, \r\n        DmpCallback, \r\n        0, \r\n        google_breakpad::ExceptionHandler::HANDLER_ALL, \r\n        MiniDumpNormal, \r\n        L&quot;&quot;, \r\n        0 );\r\n<\/pre>\n<p>Note, that the directory you have specified for storing dumps should already be created &#8211; Breakpad will not create it itself. Also, it should be writeable by your application, obsviously.<\/p>\n<p>Callback functions (DmpFilter and DmpCallback) are needed if you want to do something when crash happens. For example, if you want to ask user if he WANTS to send you a crash report, you can do it in Filter callback, and then, if he answers yes, use CrashReportSender in Minidump callback.<\/p>\n<p>For your convenience, here&#8217;s some information about constants used by ExceptionHandler:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nenum HandlerType {\r\n    HANDLER_NONE = 0,\r\n    HANDLER_EXCEPTION = 1 &lt;&lt; 0,          \/\/ SetUnhandledExceptionFilter\r\n    HANDLER_INVALID_PARAMETER = 1 &lt;&lt; 1,  \/\/ _set_invalid_parameter_handler\r\n    HANDLER_PURECALL = 1 &lt;&lt; 2,           \/\/ _set_purecall_handler\r\n    HANDLER_ALL = HANDLER_EXCEPTION |\r\n                  HANDLER_INVALID_PARAMETER |\r\n                  HANDLER_PURECALL\r\n  };\r\n<\/pre>\n<p>For information about Microsoft&#8217;s minidump type (in example, MiniDumpNormal is used), see <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms680519%28v=vs.85%29.aspx\">MSDN<\/a>.<\/p>\n<h3>3. Sending crash information to server<\/h3>\n<p>You can just ask your users to send you minidumps generated by breakpad to your mail, or upload them manually, but Breakpad also includes facility for sending them to server directly. There is a class, called CrashReportSender in <b>client\/windows\/sender\/crash_report_sender.h<\/b>, which is easy to use.<\/p>\n<p>In your MinidumpHandler, write something like this:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n      \/\/ Instantiate CrashReportSender, specifying checkpoint file, where it stores information about number of dumps sent per day, to limit itself\r\n\tgoogle_breakpad::CrashReportSender sender( L&quot;crash.checkpoint&quot; );\r\n      \/\/ Set maximum numer of reports per day from one user, or -1 for unlimited reports\r\n\tsender.set_max_reports_per_day( 5 );\r\n      \/\/ You can fill this map with additional params, for example, video adapter information or application's inner version, or something\r\n\tstd::map&lt;std::wstring, std::wstring&gt; params;\r\n      \/\/ Callback parameters do not give you an exact name of generated minidump file, but you can reconstruct it\r\n\tstd::wstring filename = dump_path;\r\n\tfilename += L&quot;\\\\&quot;;\r\n\tfilename += minidump_id;\r\n\tfilename += L&quot;.dmp&quot;;\r\n      \/\/ Finally, send a report\r\n\tgoogle_breakpad::ReportResult r = sender.SendCrashReport( L&quot;http:\/\/your.site.here&quot;, params, filename, 0 );\r\n\r\n      \/\/ Possibly notify user about success\/failure\r\n\tif ( r == google_breakpad::RESULT_SUCCEEDED )\r\n\t\tMessageBox( 0, &quot;Crash report was sent. Thank you!&quot;, &quot;Crash report&quot;, MB_OK|MB_ICONINFORMATION );\r\n\telse\r\n\t\tMessageBox( 0, &quot;Could not send crash report. Thank you for trying, though!&quot;, &quot;Crash report&quot;, MB_OK|MB_ICONWARNING );\r\n\r\n\treturn false;\r\n<\/pre>\n<h3>4. Receiving crash reports<\/h3>\n<p>Now that you have a client that sends crash reports, you may wonder where&#8217;s the server which will receive and store them. Unfortunately, Google does not provide such server, even a basic one. Unless you want to write one yourself (which could be easy or hard, depending on feature set), you have just two alternatives.<\/p>\n<p>There is Mozilla&#8217;s <a href=\"https:\/\/github.com\/mozilla\/socorro\">Socorro<\/a> server, which can handle millions of crashes per day, display all kinds of statistics about them, aggregate them in useful manner etc. Unfortunately, it&#8217;s a bitch to set up, because it has a list of dependencies long enough to scare a grown man, including non-negotiable PostgressSQL database. I haven&#8217;t even tried it.<\/p>\n<p>The other server is <a href=\"https:\/\/github.com\/atom\/mini-breakpad-server\">mini-breakpad-server<\/a>. It has very small number of features, but it&#8217;s far easier to set up, even though it requires Node.js. It only supports uploading and displaying of crash reports with resolved symbols, but it should be enough for the most small projects.<\/p>\n<p>One thing it does NOT support is uploading of symbol files. Documentation specifies that you should upload them manually into pool\/symbols\/PRODUCT_NAME. This is a (partial) lie. Actually, your symbols should be stored in this way:<\/p>\n<p><b>pool\/symbols\/ExeOrDllName.pdb\/VERSION_ID\/ExeOrDllName.sym<\/b><\/p>\n<p>Note, that Breakpad does not use native symbol formats (pdb, dwarf or otherwise), but instead its own, which can be generated from native formats by running <b>dump_syms<\/b> or <b>symupload<\/b> tools, provided with Breakpad. VERSION_ID could be obtained from .sym file by looking for a long string of digits and letters in the first line of file.<\/p>\n<p>After you have mini-breakpad-server set up correctly (don&#8217;t forget to change its directory&#8217;s ownership to a proper user!), you can now specify &#8220;http:\/\/your.site:1127\/post&#8221; in call to SendCrashReport, and a minidump file will be uploaded.<\/p>\n<p>This tools are bound to Visual Studio version. So, for example, if they are compiled with VS2013, they will NOT work with PDB files generated by VS2010. Versions, which are committed to Google&#8217;s Git are created in Visual Studio 2013. If you need to use them with some other version, you&#8217;ll have to recompile them yourself (which shouldn&#8217;t be hard), otherwise you&#8217;ll get some cryptic errors about <b>msdia*.dll<\/b> not being registered.<\/p>\n<p>Returning to mini-breakpad-server, I found that you can&#8217;t install it using <b>npm<\/b>, as specified in documentation, because some dependencies are broken. However, you can just download it from GitHub and run <b>npm install<\/b> in its root directory. After that, run <i>bin\/mini-breakpad-server<\/i> and watch it work (don&#8217;t forget to run it a a daemon if you want to collect crash reports at all times!).<\/p>\n<p>I found the process of uploading symbols manually to be inconvenient, so I modified mini-breakpad-server to allow using Google&#8217;s <b>symupload<\/b> to upload symbols to correct paths from my Windows machine. Some time, I&#8217;ll try to get my changes merged into master branch, but currently you can download my modified version here: <a href=\"http:\/\/zxstudio.org\/projects\/mini-breakpad-server\/mini-breakpad-server-maxed.zip\">mini-breakpad-server-maxed.zip<\/a>.<br \/>\n<b>PLEASE NOTE: My version of server could now be obsolete; I&#8217;m not planning on maintaining it until I have the need to do it, so you might be better off by looking at <a href=\"https:\/\/github.com\/electron\/mini-breakpad-server\/network\">one of the forks<\/a> of original server, some of which are in active development<\/b><\/p>\n<p>If you use this version, you can run<\/p>\n<p><b>symupload YourProgram.exe http:\/\/your.server:1127\/symbols<\/b><\/p>\n<p>and symbols should be uploaded to a correct path.<\/p>\n<h3>5. Conclusion<\/h3>\n<p>I found all information necessary to get all this set up from examining source files and, in one case, running strace to find out where the hell does mini-breakpad-server looks for symbol files. I hope this post should make up somewhat for the lack of documentation for both Breakapd and mini-breakpad-server. If you have any further questions, feel free to post them here.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>That programs have bugs is a given in modern times. We all make mistakes, and even if we don&#8217;t, we use somebody else&#8217;s code, which may contain errors. When your program crashes on user&#8217;s computer, you should know about it, and that&#8217;s where Crash Reporting comes in. We all have seen it in Windows, MacOS <a class=\"read-more\" href=\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integrating Google Breakpad - ZX Studio Blog<\/title>\n<meta name=\"description\" content=\"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating Google Breakpad - ZX Studio Blog\" \/>\n<meta property=\"og:description\" content=\"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/\" \/>\n<meta property=\"og:site_name\" content=\"ZX Studio Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-10-28T19:05:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-05-09T08:17:54+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"MaxEd\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/zxstudio.org\/blog\/#website\",\"url\":\"http:\/\/zxstudio.org\/blog\/\",\"name\":\"ZX Studio Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/zxstudio.org\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage\",\"url\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/\",\"name\":\"Integrating Google Breakpad - ZX Studio Blog\",\"isPartOf\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/#website\"},\"datePublished\":\"2014-10-28T19:05:56+00:00\",\"dateModified\":\"2016-05-09T08:17:54+00:00\",\"description\":\"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.\",\"breadcrumb\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e\",\"item\":\"http:\/\/zxstudio.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating Google Breakpad\"}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage\"},\"author\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78\"},\"headline\":\"Integrating Google Breakpad\",\"datePublished\":\"2014-10-28T19:05:56+00:00\",\"dateModified\":\"2016-05-09T08:17:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage\"},\"wordCount\":2096,\"commentCount\":57,\"publisher\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78\"},\"articleSection\":[\"General\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78\",\"name\":\"MaxEd\",\"logo\":{\"@id\":\"http:\/\/zxstudio.org\/blog\/#personlogo\"},\"description\":\"I'm a video games programmer. I have worked in game industry since 2008 on MMOs and mobile games, but now I work for Owlcat Games on great old-school RPGs. In my free time, I like to play rock'n'roll on my guitar and travel.\",\"url\":\"http:\/\/zxstudio.org\/blog\/author\/maxed\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Integrating Google Breakpad - ZX Studio Blog","description":"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/","og_locale":"en_US","og_type":"article","og_title":"Integrating Google Breakpad - ZX Studio Blog","og_description":"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.","og_url":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/","og_site_name":"ZX Studio Blog","article_published_time":"2014-10-28T19:05:56+00:00","article_modified_time":"2016-05-09T08:17:54+00:00","twitter_misc":{"Written by":"MaxEd","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/zxstudio.org\/blog\/#website","url":"http:\/\/zxstudio.org\/blog\/","name":"ZX Studio Blog","description":"","publisher":{"@id":"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/zxstudio.org\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"WebPage","@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage","url":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/","name":"Integrating Google Breakpad - ZX Studio Blog","isPartOf":{"@id":"http:\/\/zxstudio.org\/blog\/#website"},"datePublished":"2014-10-28T19:05:56+00:00","dateModified":"2016-05-09T08:17:54+00:00","description":"Integrate Google Breakpad into your application and set up mini-breakpad-server to collect crash reports.","breadcrumb":{"@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e","item":"http:\/\/zxstudio.org\/blog\/"},{"@type":"ListItem","position":2,"name":"Integrating Google Breakpad"}]},{"@type":"Article","@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#article","isPartOf":{"@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage"},"author":{"@id":"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78"},"headline":"Integrating Google Breakpad","datePublished":"2014-10-28T19:05:56+00:00","dateModified":"2016-05-09T08:17:54+00:00","mainEntityOfPage":{"@id":"http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#webpage"},"wordCount":2096,"commentCount":57,"publisher":{"@id":"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78"},"articleSection":["General"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/zxstudio.org\/blog\/2014\/10\/28\/integrating-google-breakpad\/#respond"]}]},{"@type":["Person","Organization"],"@id":"http:\/\/zxstudio.org\/blog\/#\/schema\/person\/0a2cf38b4b9456c20b27bf9837c90b78","name":"MaxEd","logo":{"@id":"http:\/\/zxstudio.org\/blog\/#personlogo"},"description":"I'm a video games programmer. I have worked in game industry since 2008 on MMOs and mobile games, but now I work for Owlcat Games on great old-school RPGs. In my free time, I like to play rock'n'roll on my guitar and travel.","url":"http:\/\/zxstudio.org\/blog\/author\/maxed\/"}]}},"_links":{"self":[{"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/posts\/85"}],"collection":[{"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":7,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":331,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/posts\/85\/revisions\/331"}],"wp:attachment":[{"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/zxstudio.org\/blog\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}