OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #endif | 52 #endif |
53 #if defined(OS_WIN) | 53 #if defined(OS_WIN) |
54 #include <windows.h> | 54 #include <windows.h> |
55 #include "base/win/windows_version.h" | 55 #include "base/win/windows_version.h" |
56 #endif | 56 #endif |
57 #if defined(OS_MACOSX) | 57 #if defined(OS_MACOSX) |
58 #include <mach/vm_param.h> | 58 #include <mach/vm_param.h> |
59 #include <malloc/malloc.h> | 59 #include <malloc/malloc.h> |
60 #include "base/mac/mac_util.h" | 60 #include "base/mac/mac_util.h" |
61 #endif | 61 #endif |
| 62 #if defined(OS_ANDROID) |
| 63 #include "third_party/lss/linux_syscall_support.h" |
| 64 #endif |
62 | 65 |
63 using base::FilePath; | 66 using base::FilePath; |
64 | 67 |
65 namespace { | 68 namespace { |
66 | 69 |
67 const char kSignalFileSlow[] = "SlowChildProcess.die"; | 70 const char kSignalFileSlow[] = "SlowChildProcess.die"; |
68 const char kSignalFileKill[] = "KilledChildProcess.die"; | 71 const char kSignalFileKill[] = "KilledChildProcess.die"; |
69 | 72 |
70 #if defined(OS_POSIX) | 73 #if defined(OS_POSIX) |
71 const char kSignalFileTerm[] = "TerminatedChildProcess.die"; | 74 const char kSignalFileTerm[] = "TerminatedChildProcess.die"; |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 // symbol data for this unit test's executable before firing the | 222 // symbol data for this unit test's executable before firing the |
220 // signal handler. | 223 // signal handler. |
221 // | 224 // |
222 // TODO(gspencer): turn this test process into a very small program | 225 // TODO(gspencer): turn this test process into a very small program |
223 // with no symbols (instead of using the multiprocess testing | 226 // with no symbols (instead of using the multiprocess testing |
224 // framework) to reduce the ReportCrash overhead. | 227 // framework) to reduce the ReportCrash overhead. |
225 const char kSignalFileCrash[] = "CrashingChildProcess.die"; | 228 const char kSignalFileCrash[] = "CrashingChildProcess.die"; |
226 | 229 |
227 MULTIPROCESS_TEST_MAIN(CrashingChildProcess) { | 230 MULTIPROCESS_TEST_MAIN(CrashingChildProcess) { |
228 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileCrash).c_str()); | 231 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileCrash).c_str()); |
229 #if defined(OS_POSIX) | 232 #if defined(OS_ANDROID) |
| 233 // Android L+ expose signal and sigaction symbols that override the system |
| 234 // ones. There is a bug in these functions where a request to set the handler |
| 235 // to SIG_DFL is ignored. In that case, an infinite loop is entered as the |
| 236 // signal is repeatedly sent to the crash dump signal handler. |
| 237 // To work around this, directly call the system's sigaction. |
| 238 struct kernel_sigaction sa; |
| 239 memset(&sa, 0, sizeof(sa)); |
| 240 sys_sigemptyset(&sa.sa_mask); |
| 241 sa.sa_handler_ = SIG_DFL; |
| 242 sa.sa_flags = SA_RESTART; |
| 243 sys_rt_sigaction(SIGSEGV, &sa, NULL, sizeof(kernel_sigset_t)); |
| 244 #elif defined(OS_POSIX) |
230 // Have to disable to signal handler for segv so we can get a crash | 245 // Have to disable to signal handler for segv so we can get a crash |
231 // instead of an abnormal termination through the crash dump handler. | 246 // instead of an abnormal termination through the crash dump handler. |
232 ::signal(SIGSEGV, SIG_DFL); | 247 ::signal(SIGSEGV, SIG_DFL); |
233 #endif | 248 #endif |
234 // Make this process have a segmentation fault. | 249 // Make this process have a segmentation fault. |
235 volatile int* oops = NULL; | 250 volatile int* oops = NULL; |
236 *oops = 0xDEAD; | 251 *oops = 0xDEAD; |
237 return 1; | 252 return 1; |
238 } | 253 } |
239 | 254 |
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 options.current_directory = base::FilePath("/dev/null"); | 1120 options.current_directory = base::FilePath("/dev/null"); |
1106 | 1121 |
1107 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); | 1122 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); |
1108 ASSERT_TRUE(process.IsValid()); | 1123 ASSERT_TRUE(process.IsValid()); |
1109 | 1124 |
1110 int exit_code = kSuccess; | 1125 int exit_code = kSuccess; |
1111 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 1126 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
1112 EXPECT_NE(kSuccess, exit_code); | 1127 EXPECT_NE(kSuccess, exit_code); |
1113 } | 1128 } |
1114 #endif | 1129 #endif |
OLD | NEW |