| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #include "handler/mac/crash_report_exception_handler.h" | 15 #include "handler/mac/crash_report_exception_handler.h" |
| 16 | 16 |
| 17 #include <servers/bootstrap.h> | |
| 18 | |
| 19 #include <vector> | 17 #include <vector> |
| 20 | 18 |
| 21 #include "base/logging.h" | 19 #include "base/logging.h" |
| 22 #include "base/mac/mach_logging.h" | 20 #include "base/mac/mach_logging.h" |
| 21 #include "base/mac/scoped_mach_port.h" |
| 23 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
| 24 #include "client/settings.h" | 23 #include "client/settings.h" |
| 25 #include "minidump/minidump_file_writer.h" | 24 #include "minidump/minidump_file_writer.h" |
| 26 #include "snapshot/crashpad_info_client_options.h" | 25 #include "snapshot/crashpad_info_client_options.h" |
| 27 #include "snapshot/mac/process_snapshot_mac.h" | 26 #include "snapshot/mac/process_snapshot_mac.h" |
| 28 #include "util/file/file_writer.h" | 27 #include "util/file/file_writer.h" |
| 29 #include "util/mach/exc_client_variants.h" | 28 #include "util/mach/exc_client_variants.h" |
| 30 #include "util/mach/exception_behaviors.h" | 29 #include "util/mach/exception_behaviors.h" |
| 31 #include "util/mach/exception_types.h" | 30 #include "util/mach/exception_types.h" |
| 32 #include "util/mach/mach_extensions.h" | 31 #include "util/mach/mach_extensions.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 // receive under normal conditions. Although the system crash reporter is | 194 // receive under normal conditions. Although the system crash reporter is |
| 196 // able to deal with other exceptions including simulated ones, forwarding | 195 // able to deal with other exceptions including simulated ones, forwarding |
| 197 // them to the system crash reporter could present the system’s crash UI for | 196 // them to the system crash reporter could present the system’s crash UI for |
| 198 // processes that haven’t actually crashed, and could result in reports not | 197 // processes that haven’t actually crashed, and could result in reports not |
| 199 // actually associated with crashes being sent to the operating system | 198 // actually associated with crashes being sent to the operating system |
| 200 // vendor. | 199 // vendor. |
| 201 // | 200 // |
| 202 // Note that normally, EXC_RESOURCE and EXC_GUARD exceptions are sent to the | 201 // Note that normally, EXC_RESOURCE and EXC_GUARD exceptions are sent to the |
| 203 // system-level com.apple.ReportCrash.Root job, and not to the user-level | 202 // system-level com.apple.ReportCrash.Root job, and not to the user-level |
| 204 // job that they are forwarded to here. | 203 // job that they are forwarded to here. |
| 205 mach_port_t system_crash_reporter_port; | 204 base::mac::ScopedMachSendRight |
| 206 const char kSystemCrashReporterServiceName[] = "com.apple.ReportCrash"; | 205 system_crash_reporter_handler(SystemCrashReporterHandler()); |
| 207 kern_return_t kr = bootstrap_look_up(bootstrap_port, | 206 if (system_crash_reporter_handler) { |
| 208 kSystemCrashReporterServiceName, | |
| 209 &system_crash_reporter_port); | |
| 210 if (kr != BOOTSTRAP_SUCCESS) { | |
| 211 BOOTSTRAP_LOG(ERROR, kr) << "bootstrap_look_up " | |
| 212 << kSystemCrashReporterServiceName; | |
| 213 } else { | |
| 214 // Make copies of mutable out parameters so that the system crash reporter | 207 // Make copies of mutable out parameters so that the system crash reporter |
| 215 // can’t influence the state returned by this method. | 208 // can’t influence the state returned by this method. |
| 216 thread_state_flavor_t flavor_forward = *flavor; | 209 thread_state_flavor_t flavor_forward = *flavor; |
| 217 mach_msg_type_number_t new_state_forward_count = *new_state_count; | 210 mach_msg_type_number_t new_state_forward_count = *new_state_count; |
| 218 std::vector<natural_t> new_state_forward( | 211 std::vector<natural_t> new_state_forward( |
| 219 new_state, new_state + new_state_forward_count); | 212 new_state, new_state + new_state_forward_count); |
| 220 | 213 |
| 221 // The system crash reporter requires the behavior to be | 214 // The system crash reporter requires the behavior to be |
| 222 // EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES. It uses the identity | 215 // EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES. It uses the identity |
| 223 // parameters but doesn’t appear to use the state parameters, including | 216 // parameters but doesn’t appear to use the state parameters, including |
| 224 // |flavor|, and doesn’t care if they are 0 or invalid. As long as an | 217 // |flavor|, and doesn’t care if they are 0 or invalid. As long as an |
| 225 // identity is available (checked above), any other exception behavior is | 218 // identity is available (checked above), any other exception behavior is |
| 226 // converted to what the system crash reporter wants, with the caveat that | 219 // converted to what the system crash reporter wants, with the caveat that |
| 227 // problems may arise if the state wasn’t available and the system crash | 220 // problems may arise if the state wasn’t available and the system crash |
| 228 // reporter changes in the future to use it. However, normally, the state | 221 // reporter changes in the future to use it. However, normally, the state |
| 229 // will be available. | 222 // will be available. |
| 230 kr = UniversalExceptionRaise( | 223 kern_return_t kr = UniversalExceptionRaise( |
| 231 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, | 224 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, |
| 232 system_crash_reporter_port, | 225 system_crash_reporter_handler, |
| 233 thread, | 226 thread, |
| 234 task, | 227 task, |
| 235 exception, | 228 exception, |
| 236 code, | 229 code, |
| 237 code_count, | 230 code_count, |
| 238 &flavor_forward, | 231 &flavor_forward, |
| 239 old_state, | 232 old_state, |
| 240 old_state_count, | 233 old_state_count, |
| 241 new_state_forward_count ? &new_state_forward[0] : nullptr, | 234 new_state_forward_count ? &new_state_forward[0] : nullptr, |
| 242 &new_state_forward_count); | 235 &new_state_forward_count); |
| 243 MACH_LOG_IF(WARNING, kr != KERN_SUCCESS, kr) | 236 MACH_LOG_IF(WARNING, kr != KERN_SUCCESS, kr) << "UniversalExceptionRaise"; |
| 244 << "UniversalExceptionRaise " << kSystemCrashReporterServiceName; | |
| 245 } | 237 } |
| 246 } | 238 } |
| 247 | 239 |
| 248 ExcServerCopyState( | 240 ExcServerCopyState( |
| 249 behavior, old_state, old_state_count, new_state, new_state_count); | 241 behavior, old_state, old_state_count, new_state, new_state_count); |
| 250 | 242 |
| 251 return ExcServerSuccessfulReturnValue(exception, behavior, false); | 243 return ExcServerSuccessfulReturnValue(exception, behavior, false); |
| 252 } | 244 } |
| 253 | 245 |
| 254 } // namespace crashpad | 246 } // namespace crashpad |
| OLD | NEW |