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 |