| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 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, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 ~MachSendRightPool() { | 67 ~MachSendRightPool() { |
| 68 for (mach_port_t send_right : send_rights_) { | 68 for (mach_port_t send_right : send_rights_) { |
| 69 kern_return_t kr = mach_port_deallocate(mach_task_self(), send_right); | 69 kern_return_t kr = mach_port_deallocate(mach_task_self(), send_right); |
| 70 MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr) << "mach_port_deallocate"; | 70 MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr) << "mach_port_deallocate"; |
| 71 } | 71 } |
| 72 } | 72 } |
| 73 | 73 |
| 74 //! \brief Adds a send right to the pool. | 74 //! \brief Adds a send right to the pool. |
| 75 //! | 75 //! |
| 76 //! \param[in] send_right The send right to be added. The pool object takes | 76 //! \param[in] send_right The send right to be added. The pool object takes |
| 77 //! ownership of the send right, which remains valid until the pool object | 77 //! its own reference to the send right, which remains valid until the |
| 78 //! is destroyed. | 78 //! pool object is destroyed. The caller remains responsible for its |
| 79 //! reference to the send right. |
| 79 //! | 80 //! |
| 80 //! It is possible and in fact likely that one pool will wind up owning the | 81 //! It is possible and in fact likely that one pool will wind up owning the |
| 81 //! same send right multiple times. This is acceptable, because send rights | 82 //! same send right multiple times. This is acceptable, because send rights |
| 82 //! are reference-counted. | 83 //! are reference-counted. |
| 83 void AddSendRight(mach_port_t send_right) { | 84 void AddSendRight(mach_port_t send_right) { |
| 85 kern_return_t kr = mach_port_mod_refs(mach_task_self(), |
| 86 send_right, |
| 87 MACH_PORT_RIGHT_SEND, |
| 88 1); |
| 89 MACH_CHECK(kr == KERN_SUCCESS, kr) << "mach_port_mod_refs"; |
| 90 |
| 84 send_rights_.push_back(send_right); | 91 send_rights_.push_back(send_right); |
| 85 } | 92 } |
| 86 | 93 |
| 87 private: | 94 private: |
| 88 std::vector<mach_port_t> send_rights_; | 95 std::vector<mach_port_t> send_rights_; |
| 89 | 96 |
| 90 DISALLOW_COPY_AND_ASSIGN(MachSendRightPool); | 97 DISALLOW_COPY_AND_ASSIGN(MachSendRightPool); |
| 91 }; | 98 }; |
| 92 | 99 |
| 93 struct ExceptionHandlerDescription { | 100 struct ExceptionHandlerDescription { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 // value, which can then be associated with handlers shown by | 188 // value, which can then be associated with handlers shown by |
| 182 // ShowExceptionPorts(). Any send rights obtained by this function are added to | 189 // ShowExceptionPorts(). Any send rights obtained by this function are added to |
| 183 // |mach_send_right_pool|. | 190 // |mach_send_right_pool|. |
| 184 void ShowBootstrapService(const std::string& service_name, | 191 void ShowBootstrapService(const std::string& service_name, |
| 185 MachSendRightPool* mach_send_right_pool) { | 192 MachSendRightPool* mach_send_right_pool) { |
| 186 base::mac::ScopedMachSendRight service_port(BootstrapLookUp(service_name)); | 193 base::mac::ScopedMachSendRight service_port(BootstrapLookUp(service_name)); |
| 187 if (service_port == kMachPortNull) { | 194 if (service_port == kMachPortNull) { |
| 188 return; | 195 return; |
| 189 } | 196 } |
| 190 | 197 |
| 198 mach_send_right_pool->AddSendRight(service_port); |
| 199 |
| 191 printf("service %s %#x\n", service_name.c_str(), service_port.get()); | 200 printf("service %s %#x\n", service_name.c_str(), service_port.get()); |
| 192 | |
| 193 mach_send_right_pool->AddSendRight(service_port.release()); | |
| 194 } | 201 } |
| 195 | 202 |
| 196 // Prints information about all exception ports known for |exception_ports|. If | 203 // Prints information about all exception ports known for |exception_ports|. If |
| 197 // |numeric| is true, all information is printed in numeric form, otherwise, it | 204 // |numeric| is true, all information is printed in numeric form, otherwise, it |
| 198 // will be converted to symbolic constants where possible by | 205 // will be converted to symbolic constants where possible by |
| 199 // SymbolicConstantsMach. If |is_new| is true, information will be presented as | 206 // SymbolicConstantsMach. If |is_new| is true, information will be presented as |
| 200 // “new exception ports”, indicating that they show the state of the exception | 207 // “new exception ports”, indicating that they show the state of the exception |
| 201 // ports after SetExceptionPort() has been called. Any send rights obtained by | 208 // ports after SetExceptionPort() has been called. Any send rights obtained by |
| 202 // this function are added to |mach_send_right_pool|. | 209 // this function are added to |mach_send_right_pool|. |
| 203 void ShowExceptionPorts(const ExceptionPorts& exception_ports, | 210 void ShowExceptionPorts(const ExceptionPorts& exception_ports, |
| 204 bool numeric, | 211 bool numeric, |
| 205 bool is_new, | 212 bool is_new, |
| 206 MachSendRightPool* mach_send_right_pool) { | 213 MachSendRightPool* mach_send_right_pool) { |
| 207 const char* target_name = exception_ports.TargetTypeName(); | 214 const char* target_name = exception_ports.TargetTypeName(); |
| 208 | 215 |
| 209 std::vector<ExceptionPorts::ExceptionHandler> handlers; | 216 ExceptionPorts::ExceptionHandlerVector handlers; |
| 210 if (!exception_ports.GetExceptionPorts(ExcMaskValid(), &handlers)) { | 217 if (!exception_ports.GetExceptionPorts(ExcMaskValid(), &handlers)) { |
| 211 return; | 218 return; |
| 212 } | 219 } |
| 213 | 220 |
| 214 const char* age_name = is_new ? "new " : ""; | 221 const char* age_name = is_new ? "new " : ""; |
| 215 | 222 |
| 216 if (handlers.size() == 0) { | 223 if (handlers.empty()) { |
| 217 printf("no %s%s exception ports\n", age_name, target_name); | 224 printf("no %s%s exception ports\n", age_name, target_name); |
| 218 } | 225 } |
| 219 | 226 |
| 220 for (size_t port_index = 0; port_index < handlers.size(); ++port_index) { | 227 for (size_t port_index = 0; port_index < handlers.size(); ++port_index) { |
| 221 mach_send_right_pool->AddSendRight(handlers[port_index].port); | 228 mach_send_right_pool->AddSendRight(handlers[port_index].port); |
| 222 | 229 |
| 223 if (numeric) { | 230 if (numeric) { |
| 224 printf( | 231 printf( |
| 225 "%s%s exception port %zu, mask %#x, port %#x, " | 232 "%s%s exception port %zu, mask %#x, port %#x, " |
| 226 "behavior %#x, flavor %u\n", | 233 "behavior %#x, flavor %u\n", |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 | 582 |
| 576 return kExitSuccess; | 583 return kExitSuccess; |
| 577 } | 584 } |
| 578 | 585 |
| 579 } // namespace | 586 } // namespace |
| 580 } // namespace crashpad | 587 } // namespace crashpad |
| 581 | 588 |
| 582 int main(int argc, char* argv[]) { | 589 int main(int argc, char* argv[]) { |
| 583 return crashpad::ExceptionPortToolMain(argc, argv); | 590 return crashpad::ExceptionPortToolMain(argc, argv); |
| 584 } | 591 } |
| OLD | NEW |