Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: common/mac/launch_reporter.cc

Issue 571523004: Mac: Add support for in-process crash reporting (Closed) Base URL: https://chromium.googlesource.com/external/google-breakpad/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « common/mac/launch_reporter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 Google Inc. 1 // Copyright (c) 2014, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer 11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the 12 // in the documentation and/or other materials provided with the
13 // distribution. 13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its 14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from 15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission. 16 // this software without specific prior written permission.
17 // 17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 29
30 #include "common/linux/crc32.h" 30 #include <stdio.h>
31 #include <sys/wait.h>
32 #include <unistd.h>
31 33
32 namespace google_breakpad { 34 namespace google_breakpad {
33 35
34 // This implementation is based on the sample implementation in RFC 1952. 36 void LaunchReporter(const char *reporter_executable_path,
37 const char *config_file_path) {
38 const char* argv[] = { reporter_executable_path, config_file_path, NULL };
35 39
36 // CRC32 polynomial, in reversed form. 40 // Launch the reporter
37 // See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check 41 pid_t pid = fork();
38 static const uint32_t kCrc32Polynomial = 0xEDB88320;
39 static uint32_t kCrc32Table[256] = { 0 };
40 42
41 #define arraysize(f) (sizeof(f) / sizeof(*f)) 43 if (pid == -1) {
44 perror("fork");
45 fprintf(stderr, "Failed to fork reporter process\n");
46 return;
47 }
42 48
43 static void EnsureCrc32TableInited() { 49 // If we're in the child, load in our new executable and run.
44 if (kCrc32Table[arraysize(kCrc32Table) - 1]) 50 // The parent will not wait for the child to complete.
45 return; // already inited 51 if (pid == 0) {
46 for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) { 52 execv(argv[0], (char* const*)argv);
47 uint32_t c = i; 53 perror("exec");
48 for (size_t j = 0; j < 8; ++j) { 54 fprintf(stderr,
49 if (c & 1) { 55 "Failed to launch reporter process from path %s\n",
50 c = kCrc32Polynomial ^ (c >> 1); 56 reporter_executable_path);
51 } else { 57 unlink(config_file_path); // launch failed - get rid of config file
52 c >>= 1; 58 _exit(1);
53 } 59 }
60
61 // Wait until the Reporter child process exits.
62 //
63
64 // We'll use a timeout of one minute.
65 int timeout_count = 60; // 60 seconds
66
67 while (timeout_count-- > 0) {
68 int status;
69 pid_t result = waitpid(pid, &status, WNOHANG);
70
71 if (result == 0) {
72 // The child has not yet finished.
73 sleep(1);
74 } else if (result == -1) {
75 // error occurred.
76 break;
77 } else {
78 // child has finished
79 break;
54 } 80 }
55 kCrc32Table[i] = c;
56 } 81 }
57 } 82 }
58 83
59 uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
60 EnsureCrc32TableInited();
61
62 uint32_t c = start ^ 0xFFFFFFFF;
63 const uint8_t* u = static_cast<const uint8_t*>(buf);
64 for (size_t i = 0; i < len; ++i) {
65 c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
66 }
67 return c ^ 0xFFFFFFFF;
68 }
69
70 } // namespace google_breakpad 84 } // namespace google_breakpad
OLDNEW
« no previous file with comments | « common/mac/launch_reporter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698