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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 | 173 |
174 return true; | 174 return true; |
175 } | 175 } |
176 | 176 |
177 // ShowExceptionPorts() shows handlers as numeric mach_port_t values, which are | 177 // ShowExceptionPorts() shows handlers as numeric mach_port_t values, which are |
178 // opaque and meaningless on their own. ShowBootstrapService() can be used to | 178 // opaque and meaningless on their own. ShowBootstrapService() can be used to |
179 // look up a service with the bootstrap server by name and show its mach_port_t | 179 // look up a service with the bootstrap server by name and show its mach_port_t |
180 // value, which can then be associated with handlers shown by | 180 // value, which can then be associated with handlers shown by |
181 // ShowExceptionPorts(). Any send rights obtained by this function are added to | 181 // ShowExceptionPorts(). Any send rights obtained by this function are added to |
182 // |mach_send_right_pool|. | 182 // |mach_send_right_pool|. |
183 void ShowBootstrapService( | 183 void ShowBootstrapService(const std::string& service_name, |
184 const std::string& service_name, MachSendRightPool* mach_send_right_pool) { | 184 MachSendRightPool* mach_send_right_pool) { |
185 mach_port_t service_port; | 185 mach_port_t service_port; |
186 kern_return_t kr = bootstrap_look_up( | 186 kern_return_t kr = bootstrap_look_up( |
187 bootstrap_port, const_cast<char*>(service_name.c_str()), &service_port); | 187 bootstrap_port, const_cast<char*>(service_name.c_str()), &service_port); |
188 if (kr != BOOTSTRAP_SUCCESS) { | 188 if (kr != BOOTSTRAP_SUCCESS) { |
189 BOOTSTRAP_LOG(ERROR, kr) << "bootstrap_look_up " << service_name; | 189 BOOTSTRAP_LOG(ERROR, kr) << "bootstrap_look_up " << service_name; |
190 return; | 190 return; |
191 } | 191 } |
192 | 192 |
193 mach_send_right_pool->AddSendRight(service_port); | 193 mach_send_right_pool->AddSendRight(service_port); |
194 | 194 |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 MachSendRightPool mach_send_right_pool; | 510 MachSendRightPool mach_send_right_pool; |
511 | 511 |
512 // Show bootstrap services requested. | 512 // Show bootstrap services requested. |
513 for (const char* service : options.show_bootstrap) { | 513 for (const char* service : options.show_bootstrap) { |
514 ShowBootstrapService(service, &mach_send_right_pool); | 514 ShowBootstrapService(service, &mach_send_right_pool); |
515 } | 515 } |
516 | 516 |
517 // Show the original exception ports. | 517 // Show the original exception ports. |
518 if (options.show_host) { | 518 if (options.show_host) { |
519 ShowExceptionPorts( | 519 ShowExceptionPorts( |
520 ExceptionPorts(ExceptionPorts::kTargetTypeHost, MACH_PORT_NULL), | 520 ExceptionPorts(ExceptionPorts::kTargetTypeHost, HOST_NULL), |
521 options.numeric, | 521 options.numeric, |
522 false, | 522 false, |
523 &mach_send_right_pool); | 523 &mach_send_right_pool); |
524 } | 524 } |
525 if (options.show_task) { | 525 if (options.show_task) { |
526 ShowExceptionPorts( | 526 ShowExceptionPorts( |
527 ExceptionPorts(ExceptionPorts::kTargetTypeTask, options.alternate_task), | 527 ExceptionPorts(ExceptionPorts::kTargetTypeTask, options.alternate_task), |
528 options.numeric, | 528 options.numeric, |
529 false, | 529 false, |
530 &mach_send_right_pool); | 530 &mach_send_right_pool); |
531 } | 531 } |
532 if (options.show_thread) { | 532 if (options.show_thread) { |
533 ShowExceptionPorts( | 533 ShowExceptionPorts( |
534 ExceptionPorts(ExceptionPorts::kTargetTypeThread, MACH_PORT_NULL), | 534 ExceptionPorts(ExceptionPorts::kTargetTypeThread, THREAD_NULL), |
535 options.numeric, | 535 options.numeric, |
536 false, | 536 false, |
537 &mach_send_right_pool); | 537 &mach_send_right_pool); |
538 } | 538 } |
539 | 539 |
540 if (!options.set_handler.empty()) { | 540 if (!options.set_handler.empty()) { |
541 // Set new exception handlers. | 541 // Set new exception handlers. |
542 for (ExceptionHandlerDescription description : options.set_handler) { | 542 for (ExceptionHandlerDescription description : options.set_handler) { |
543 if (!SetExceptionPort( | 543 if (!SetExceptionPort( |
544 &description, | 544 &description, |
545 description.target_type == ExceptionPorts::kTargetTypeTask | 545 description.target_type == ExceptionPorts::kTargetTypeTask |
546 ? options.alternate_task | 546 ? options.alternate_task |
547 : MACH_PORT_NULL)) { | 547 : TASK_NULL)) { |
548 return kExitFailure; | 548 return kExitFailure; |
549 } | 549 } |
550 } | 550 } |
551 | 551 |
552 // Show changed exception ports. | 552 // Show changed exception ports. |
553 if (options.show_new_host) { | 553 if (options.show_new_host) { |
554 ShowExceptionPorts( | 554 ShowExceptionPorts( |
555 ExceptionPorts(ExceptionPorts::kTargetTypeHost, MACH_PORT_NULL), | 555 ExceptionPorts(ExceptionPorts::kTargetTypeHost, HOST_NULL), |
556 options.numeric, | 556 options.numeric, |
557 true, | 557 true, |
558 &mach_send_right_pool); | 558 &mach_send_right_pool); |
559 } | 559 } |
560 if (options.show_new_task) { | 560 if (options.show_new_task) { |
561 ShowExceptionPorts( | 561 ShowExceptionPorts( |
562 ExceptionPorts(ExceptionPorts::kTargetTypeTask, | 562 ExceptionPorts(ExceptionPorts::kTargetTypeTask, |
563 options.alternate_task), | 563 options.alternate_task), |
564 options.numeric, | 564 options.numeric, |
565 true, | 565 true, |
566 &mach_send_right_pool); | 566 &mach_send_right_pool); |
567 } | 567 } |
568 if (options.show_new_thread) { | 568 if (options.show_new_thread) { |
569 ShowExceptionPorts( | 569 ShowExceptionPorts( |
570 ExceptionPorts(ExceptionPorts::kTargetTypeThread, MACH_PORT_NULL), | 570 ExceptionPorts(ExceptionPorts::kTargetTypeThread, THREAD_NULL), |
571 options.numeric, | 571 options.numeric, |
572 true, | 572 true, |
573 &mach_send_right_pool); | 573 &mach_send_right_pool); |
574 } | 574 } |
575 } | 575 } |
576 | 576 |
577 if (argc) { | 577 if (argc) { |
578 // Using the remaining arguments, start a new program with the new set of | 578 // Using the remaining arguments, start a new program with the new set of |
579 // exception ports in effect. | 579 // exception ports in effect. |
580 execvp(argv[0], argv); | 580 execvp(argv[0], argv); |
581 PLOG(ERROR) << "execvp " << argv[0]; | 581 PLOG(ERROR) << "execvp " << argv[0]; |
582 return errno == ENOENT ? kExitExecENOENT : kExitExecFailure; | 582 return errno == ENOENT ? kExitExecENOENT : kExitExecFailure; |
583 } | 583 } |
584 | 584 |
585 return kExitSuccess; | 585 return kExitSuccess; |
586 } | 586 } |
587 | 587 |
588 } // namespace | 588 } // namespace |
589 } // namespace crashpad | 589 } // namespace crashpad |
590 | 590 |
591 int main(int argc, char* argv[]) { | 591 int main(int argc, char* argv[]) { |
592 return crashpad::ExceptionPortToolMain(argc, argv); | 592 return crashpad::ExceptionPortToolMain(argc, argv); |
593 } | 593 } |
OLD | NEW |