OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // For linux_syscall_support.h. This makes it safe to call embedded system | 5 // For linux_syscall_support.h. This makes it safe to call embedded system |
6 // calls when in seccomp mode. | 6 // calls when in seccomp mode. |
7 | 7 |
8 #include "components/crash/app/breakpad_linux.h" | 8 #include "components/crash/app/breakpad_linux.h" |
9 | 9 |
10 #include <fcntl.h> | 10 #include <fcntl.h> |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 } | 198 } |
199 #endif | 199 #endif |
200 | 200 |
201 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) { | 201 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) { |
202 while (len > 0 && str[len - 1] == ' ') { | 202 while (len > 0 && str[len - 1] == ' ') { |
203 len--; | 203 len--; |
204 } | 204 } |
205 return len; | 205 return len; |
206 } | 206 } |
207 | 207 |
208 void SetClientIdFromCommandLine(const CommandLine& command_line) { | 208 void SetClientIdFromCommandLine(const base::CommandLine& command_line) { |
209 // Get the guid from the command line switch. | 209 // Get the guid from the command line switch. |
210 std::string switch_value = | 210 std::string switch_value = |
211 command_line.GetSwitchValueASCII(switches::kEnableCrashReporter); | 211 command_line.GetSwitchValueASCII(switches::kEnableCrashReporter); |
212 GetCrashReporterClient()->SetCrashReporterClientIdFromGUID(switch_value); | 212 GetCrashReporterClient()->SetCrashReporterClientIdFromGUID(switch_value); |
213 } | 213 } |
214 | 214 |
215 // MIME substrings. | 215 // MIME substrings. |
216 #if defined(OS_CHROMEOS) | 216 #if defined(OS_CHROMEOS) |
217 const char g_sep[] = ":"; | 217 const char g_sep[] = ":"; |
218 #endif | 218 #endif |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 info.crash_keys = g_crash_keys; | 762 info.crash_keys = g_crash_keys; |
763 HandleCrashDump(info); | 763 HandleCrashDump(info); |
764 return FinalizeCrashDoneAndroid(false /* is_browser_process */); | 764 return FinalizeCrashDoneAndroid(false /* is_browser_process */); |
765 } | 765 } |
766 | 766 |
767 void EnableNonBrowserCrashDumping(const std::string& process_type, | 767 void EnableNonBrowserCrashDumping(const std::string& process_type, |
768 int minidump_fd) { | 768 int minidump_fd) { |
769 // This will guarantee that the BuildInfo has been initialized and subsequent | 769 // This will guarantee that the BuildInfo has been initialized and subsequent |
770 // calls will not require memory allocation. | 770 // calls will not require memory allocation. |
771 base::android::BuildInfo::GetInstance(); | 771 base::android::BuildInfo::GetInstance(); |
772 SetClientIdFromCommandLine(*CommandLine::ForCurrentProcess()); | 772 SetClientIdFromCommandLine(*base::CommandLine::ForCurrentProcess()); |
773 | 773 |
774 // On Android, the current sandboxing uses process isolation, in which the | 774 // On Android, the current sandboxing uses process isolation, in which the |
775 // child process runs with a different UID. That breaks the normal crash | 775 // child process runs with a different UID. That breaks the normal crash |
776 // reporting where the browser process generates the minidump by inspecting | 776 // reporting where the browser process generates the minidump by inspecting |
777 // the child process. This is because the browser process now does not have | 777 // the child process. This is because the browser process now does not have |
778 // the permission to access the states of the child process (as it has a | 778 // the permission to access the states of the child process (as it has a |
779 // different UID). | 779 // different UID). |
780 // TODO(jcivelli): http://b/issue?id=6776356 we should use a watchdog | 780 // TODO(jcivelli): http://b/issue?id=6776356 we should use a watchdog |
781 // process forked from the renderer process that generates the minidump. | 781 // process forked from the renderer process that generates the minidump. |
782 if (minidump_fd == -1) { | 782 if (minidump_fd == -1) { |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 // This will guarantee that the BuildInfo has been initialized and subsequent | 1628 // This will guarantee that the BuildInfo has been initialized and subsequent |
1629 // calls will not require memory allocation. | 1629 // calls will not require memory allocation. |
1630 base::android::BuildInfo::GetInstance(); | 1630 base::android::BuildInfo::GetInstance(); |
1631 | 1631 |
1632 // Handler registration is LIFO. Install the microdump handler first, such | 1632 // Handler registration is LIFO. Install the microdump handler first, such |
1633 // that if conventional minidump crash reporting is enabled below, it takes | 1633 // that if conventional minidump crash reporting is enabled below, it takes |
1634 // precedence (i.e. its handler is run first) over the microdump handler. | 1634 // precedence (i.e. its handler is run first) over the microdump handler. |
1635 InitMicrodumpCrashHandlerIfNecessary(process_type); | 1635 InitMicrodumpCrashHandlerIfNecessary(process_type); |
1636 #endif | 1636 #endif |
1637 // Determine the process type and take appropriate action. | 1637 // Determine the process type and take appropriate action. |
1638 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 1638 const base::CommandLine& parsed_command_line = |
| 1639 *base::CommandLine::ForCurrentProcess(); |
1639 if (parsed_command_line.HasSwitch(switches::kDisableBreakpad)) | 1640 if (parsed_command_line.HasSwitch(switches::kDisableBreakpad)) |
1640 return; | 1641 return; |
1641 | 1642 |
1642 if (process_type.empty()) { | 1643 if (process_type.empty()) { |
1643 bool enable_breakpad = GetCrashReporterClient()->GetCollectStatsConsent() || | 1644 bool enable_breakpad = GetCrashReporterClient()->GetCollectStatsConsent() || |
1644 GetCrashReporterClient()->IsRunningUnattended(); | 1645 GetCrashReporterClient()->IsRunningUnattended(); |
1645 enable_breakpad &= | 1646 enable_breakpad &= |
1646 !parsed_command_line.HasSwitch(switches::kDisableBreakpad); | 1647 !parsed_command_line.HasSwitch(switches::kDisableBreakpad); |
1647 if (!enable_breakpad) { | 1648 if (!enable_breakpad) { |
1648 enable_breakpad = parsed_command_line.HasSwitch( | 1649 enable_breakpad = parsed_command_line.HasSwitch( |
(...skipping 24 matching lines...) Expand all Loading... |
1673 EnableNonBrowserCrashDumping(); | 1674 EnableNonBrowserCrashDumping(); |
1674 VLOG(1) << "Non Browser crash dumping enabled for: " << process_type; | 1675 VLOG(1) << "Non Browser crash dumping enabled for: " << process_type; |
1675 #endif // #if defined(OS_ANDROID) | 1676 #endif // #if defined(OS_ANDROID) |
1676 } | 1677 } |
1677 | 1678 |
1678 PostEnableBreakpadInitialization(); | 1679 PostEnableBreakpadInitialization(); |
1679 } | 1680 } |
1680 | 1681 |
1681 #if defined(OS_ANDROID) | 1682 #if defined(OS_ANDROID) |
1682 void InitNonBrowserCrashReporterForAndroid(const std::string& process_type) { | 1683 void InitNonBrowserCrashReporterForAndroid(const std::string& process_type) { |
1683 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | 1684 const base::CommandLine* command_line = |
| 1685 base::CommandLine::ForCurrentProcess(); |
1684 | 1686 |
1685 // Handler registration is LIFO. Install the microdump handler first, such | 1687 // Handler registration is LIFO. Install the microdump handler first, such |
1686 // that if conventional minidump crash reporting is enabled below, it takes | 1688 // that if conventional minidump crash reporting is enabled below, it takes |
1687 // precedence (i.e. its handler is run first) over the microdump handler. | 1689 // precedence (i.e. its handler is run first) over the microdump handler. |
1688 InitMicrodumpCrashHandlerIfNecessary(process_type); | 1690 InitMicrodumpCrashHandlerIfNecessary(process_type); |
1689 | 1691 |
1690 if (command_line->HasSwitch(switches::kEnableCrashReporter)) { | 1692 if (command_line->HasSwitch(switches::kEnableCrashReporter)) { |
1691 // On Android we need to provide a FD to the file where the minidump is | 1693 // On Android we need to provide a FD to the file where the minidump is |
1692 // generated as the renderer and browser run with different UIDs | 1694 // generated as the renderer and browser run with different UIDs |
1693 // (preventing the browser from inspecting the renderer process). | 1695 // (preventing the browser from inspecting the renderer process). |
1694 int minidump_fd = base::GlobalDescriptors::GetInstance()->MaybeGet( | 1696 int minidump_fd = base::GlobalDescriptors::GetInstance()->MaybeGet( |
1695 GetCrashReporterClient()->GetAndroidMinidumpDescriptor()); | 1697 GetCrashReporterClient()->GetAndroidMinidumpDescriptor()); |
1696 if (minidump_fd < 0) { | 1698 if (minidump_fd < 0) { |
1697 NOTREACHED() << "Could not find minidump FD, crash reporting disabled."; | 1699 NOTREACHED() << "Could not find minidump FD, crash reporting disabled."; |
1698 } else { | 1700 } else { |
1699 InitCrashKeys(); | 1701 InitCrashKeys(); |
1700 EnableNonBrowserCrashDumping(process_type, minidump_fd); | 1702 EnableNonBrowserCrashDumping(process_type, minidump_fd); |
1701 } | 1703 } |
1702 } | 1704 } |
1703 } | 1705 } |
1704 #endif // OS_ANDROID | 1706 #endif // OS_ANDROID |
1705 | 1707 |
1706 bool IsCrashReporterEnabled() { | 1708 bool IsCrashReporterEnabled() { |
1707 return g_is_crash_reporter_enabled; | 1709 return g_is_crash_reporter_enabled; |
1708 } | 1710 } |
1709 | 1711 |
1710 } // namespace breakpad | 1712 } // namespace breakpad |
OLD | NEW |