| 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, | 
| 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 "util/mach/symbolic_constants_mach.h" | 15 #include "util/mach/symbolic_constants_mach.h" | 
| 16 | 16 | 
| 17 #include <string.h> | 17 #include <string.h> | 
| 18 | 18 | 
| 19 #include "base/basictypes.h" | 19 #include "base/basictypes.h" | 
| 20 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" | 
| 21 #include "util/mach/exception_behaviors.h" | 21 #include "util/mach/exception_behaviors.h" | 
| 22 #include "util/mach/mach_extensions.h" | 22 #include "util/mach/mach_extensions.h" | 
| 23 #include "util/stdlib/string_number_conversion.h" | 23 #include "util/stdlib/string_number_conversion.h" | 
| 24 | 24 | 
| 25 namespace { | 25 namespace { | 
| 26 | 26 | 
| 27 const char* kExceptionNames[] = { | 27 const char* kExceptionNames[] = { | 
| 28     NULL, | 28     nullptr, | 
| 29 | 29 | 
| 30     // sed -Ene 's/^#define[[:space:]]EXC_([[:graph:]]+)[[:space:]]+[[:digit:]]{
     1,2}([[:space:]]|$).*/    "\1",/p' | 30     // sed -Ene 's/^#define[[:space:]]EXC_([[:graph:]]+)[[:space:]]+[[:digit:]]{
     1,2}([[:space:]]|$).*/    "\1",/p' | 
| 31     //     /usr/include/mach/exception_types.h | 31     //     /usr/include/mach/exception_types.h | 
| 32     "BAD_ACCESS", | 32     "BAD_ACCESS", | 
| 33     "BAD_INSTRUCTION", | 33     "BAD_INSTRUCTION", | 
| 34     "ARITHMETIC", | 34     "ARITHMETIC", | 
| 35     "EMULATION", | 35     "EMULATION", | 
| 36     "SOFTWARE", | 36     "SOFTWARE", | 
| 37     "BREAKPOINT", | 37     "BREAKPOINT", | 
| 38     "SYSCALL", | 38     "SYSCALL", | 
| 39     "MACH_SYSCALL", | 39     "MACH_SYSCALL", | 
| 40     "RPC_ALERT", | 40     "RPC_ALERT", | 
| 41     "CRASH", | 41     "CRASH", | 
| 42     "RESOURCE", | 42     "RESOURCE", | 
| 43     "GUARD", | 43     "GUARD", | 
| 44 }; | 44 }; | 
| 45 static_assert(arraysize(kExceptionNames) == EXC_TYPES_COUNT, | 45 static_assert(arraysize(kExceptionNames) == EXC_TYPES_COUNT, | 
| 46               "kExceptionNames length"); | 46               "kExceptionNames length"); | 
| 47 | 47 | 
| 48 const char kExcPrefix[] = "EXC_"; | 48 const char kExcPrefix[] = "EXC_"; | 
| 49 const char kExcMaskPrefix[] = "EXC_MASK_"; | 49 const char kExcMaskPrefix[] = "EXC_MASK_"; | 
| 50 | 50 | 
| 51 const char* kBehaviorNames[] = { | 51 const char* kBehaviorNames[] = { | 
| 52     NULL, | 52     nullptr, | 
| 53 | 53 | 
| 54     // sed -Ene 's/^# define[[:space:]]EXCEPTION_([[:graph:]]+)[[:space:]]+[[:di
     git:]]{1,2}([[:space:]]|$).*/    "\1",/p' | 54     // sed -Ene 's/^# define[[:space:]]EXCEPTION_([[:graph:]]+)[[:space:]]+[[:di
     git:]]{1,2}([[:space:]]|$).*/    "\1",/p' | 
| 55     //     /usr/include/mach/exception_types.h | 55     //     /usr/include/mach/exception_types.h | 
| 56     "DEFAULT", | 56     "DEFAULT", | 
| 57     "STATE", | 57     "STATE", | 
| 58     "STATE_IDENTITY", | 58     "STATE_IDENTITY", | 
| 59 }; | 59 }; | 
| 60 | 60 | 
| 61 const char kBehaviorPrefix[] = "EXCEPTION_"; | 61 const char kBehaviorPrefix[] = "EXCEPTION_"; | 
| 62 const char kMachExceptionCodesFull[] = "MACH_EXCEPTION_CODES"; | 62 const char kMachExceptionCodesFull[] = "MACH_EXCEPTION_CODES"; | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 103     //     usr/include/mach/arm/thread_status.h | 103     //     usr/include/mach/arm/thread_status.h | 
| 104     // (iOS 7 SDK) | 104     // (iOS 7 SDK) | 
| 105     // and then fix up by making the list sparse as appropriate. | 105     // and then fix up by making the list sparse as appropriate. | 
| 106     "ARM_THREAD_STATE", | 106     "ARM_THREAD_STATE", | 
| 107     "ARM_VFP_STATE", | 107     "ARM_VFP_STATE", | 
| 108     "ARM_EXCEPTION_STATE", | 108     "ARM_EXCEPTION_STATE", | 
| 109     "ARM_DEBUG_STATE", | 109     "ARM_DEBUG_STATE", | 
| 110     "THREAD_STATE_NONE", | 110     "THREAD_STATE_NONE", | 
| 111     "ARM_THREAD_STATE64", | 111     "ARM_THREAD_STATE64", | 
| 112     "ARM_EXCEPTION_STATE64", | 112     "ARM_EXCEPTION_STATE64", | 
| 113     NULL, | 113     nullptr, | 
| 114     "ARM_THREAD_STATE32", | 114     "ARM_THREAD_STATE32", | 
| 115     NULL, | 115     nullptr, | 
| 116     NULL, | 116     nullptr, | 
| 117     NULL, | 117     nullptr, | 
| 118     NULL, | 118     nullptr, | 
| 119     "ARM_DEBUG_STATE32", | 119     "ARM_DEBUG_STATE32", | 
| 120     "ARM_DEBUG_STATE64", | 120     "ARM_DEBUG_STATE64", | 
| 121     "ARM_NEON_STATE", | 121     "ARM_NEON_STATE", | 
| 122     "ARM_NEON_STATE64", | 122     "ARM_NEON_STATE64", | 
| 123 #endif | 123 #endif | 
| 124 }; | 124 }; | 
| 125 | 125 | 
| 126 // Certain generic flavors have high constants not contiguous with the flavors | 126 // Certain generic flavors have high constants not contiguous with the flavors | 
| 127 // above. List them separately alongside their constants. | 127 // above. List them separately alongside their constants. | 
| 128 const struct { | 128 const struct { | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 187 | 187 | 
| 188 }  // namespace | 188 }  // namespace | 
| 189 | 189 | 
| 190 namespace crashpad { | 190 namespace crashpad { | 
| 191 | 191 | 
| 192 std::string ExceptionToString(exception_type_t exception, | 192 std::string ExceptionToString(exception_type_t exception, | 
| 193                               SymbolicConstantToStringOptions options) { | 193                               SymbolicConstantToStringOptions options) { | 
| 194   const char* exception_name = | 194   const char* exception_name = | 
| 195       static_cast<size_t>(exception) < arraysize(kExceptionNames) | 195       static_cast<size_t>(exception) < arraysize(kExceptionNames) | 
| 196           ? kExceptionNames[exception] | 196           ? kExceptionNames[exception] | 
| 197           : NULL; | 197           : nullptr; | 
| 198   if (!exception_name) { | 198   if (!exception_name) { | 
| 199     if (options & kUnknownIsNumeric) { | 199     if (options & kUnknownIsNumeric) { | 
| 200       return base::StringPrintf("%d", exception); | 200       return base::StringPrintf("%d", exception); | 
| 201     } | 201     } | 
| 202     return std::string(); | 202     return std::string(); | 
| 203   } | 203   } | 
| 204 | 204 | 
| 205   if (options & kUseShortName) { | 205   if (options & kUseShortName) { | 
| 206     return std::string(exception_name); | 206     return std::string(exception_name); | 
| 207   } | 207   } | 
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 356   return false; | 356   return false; | 
| 357 } | 357 } | 
| 358 | 358 | 
| 359 std::string ExceptionBehaviorToString(exception_behavior_t behavior, | 359 std::string ExceptionBehaviorToString(exception_behavior_t behavior, | 
| 360                                       SymbolicConstantToStringOptions options) { | 360                                       SymbolicConstantToStringOptions options) { | 
| 361   const exception_behavior_t basic_behavior = ExceptionBehaviorBasic(behavior); | 361   const exception_behavior_t basic_behavior = ExceptionBehaviorBasic(behavior); | 
| 362 | 362 | 
| 363   const char* behavior_name = | 363   const char* behavior_name = | 
| 364       static_cast<size_t>(basic_behavior) < arraysize(kBehaviorNames) | 364       static_cast<size_t>(basic_behavior) < arraysize(kBehaviorNames) | 
| 365           ? kBehaviorNames[basic_behavior] | 365           ? kBehaviorNames[basic_behavior] | 
| 366           : NULL; | 366           : nullptr; | 
| 367   if (!behavior_name) { | 367   if (!behavior_name) { | 
| 368     if (options & kUnknownIsNumeric) { | 368     if (options & kUnknownIsNumeric) { | 
| 369       return base::StringPrintf("%#x", behavior); | 369       return base::StringPrintf("%#x", behavior); | 
| 370     } | 370     } | 
| 371     return std::string(); | 371     return std::string(); | 
| 372   } | 372   } | 
| 373 | 373 | 
| 374   std::string behavior_string; | 374   std::string behavior_string; | 
| 375   if (options & kUseShortName) { | 375   if (options & kUseShortName) { | 
| 376     behavior_string.assign(behavior_name); | 376     behavior_string.assign(behavior_name); | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 458   } | 458   } | 
| 459 | 459 | 
| 460   return false; | 460   return false; | 
| 461 } | 461 } | 
| 462 | 462 | 
| 463 std::string ThreadStateFlavorToString(thread_state_flavor_t flavor, | 463 std::string ThreadStateFlavorToString(thread_state_flavor_t flavor, | 
| 464                                       SymbolicConstantToStringOptions options) { | 464                                       SymbolicConstantToStringOptions options) { | 
| 465   const char* flavor_name = | 465   const char* flavor_name = | 
| 466       static_cast<size_t>(flavor) < arraysize(kFlavorNames) | 466       static_cast<size_t>(flavor) < arraysize(kFlavorNames) | 
| 467           ? kFlavorNames[flavor] | 467           ? kFlavorNames[flavor] | 
| 468           : NULL; | 468           : nullptr; | 
| 469 | 469 | 
| 470   if (!flavor_name) { | 470   if (!flavor_name) { | 
| 471     for (size_t generic_flavor_index = 0; | 471     for (size_t generic_flavor_index = 0; | 
| 472          generic_flavor_index < arraysize(kGenericFlavorNames); | 472          generic_flavor_index < arraysize(kGenericFlavorNames); | 
| 473          ++generic_flavor_index) { | 473          ++generic_flavor_index) { | 
| 474       if (flavor == kGenericFlavorNames[generic_flavor_index].flavor) { | 474       if (flavor == kGenericFlavorNames[generic_flavor_index].flavor) { | 
| 475         flavor_name = kGenericFlavorNames[generic_flavor_index].name; | 475         flavor_name = kGenericFlavorNames[generic_flavor_index].name; | 
| 476         break; | 476         break; | 
| 477       } | 477       } | 
| 478     } | 478     } | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 536   } | 536   } | 
| 537 | 537 | 
| 538   if (options & kAllowNumber) { | 538   if (options & kAllowNumber) { | 
| 539     return StringToNumber(string, reinterpret_cast<unsigned int*>(flavor)); | 539     return StringToNumber(string, reinterpret_cast<unsigned int*>(flavor)); | 
| 540   } | 540   } | 
| 541 | 541 | 
| 542   return false; | 542   return false; | 
| 543 } | 543 } | 
| 544 | 544 | 
| 545 }  // namespace crashpad | 545 }  // namespace crashpad | 
| OLD | NEW | 
|---|