| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _LIBUNWINDSTACK_ERROR_H |
| #define _LIBUNWINDSTACK_ERROR_H |
| |
| #include <stdint.h> |
| |
| namespace unwindstack { |
| |
| // A bit map of warnings, multiple warnings can be set at the same time. |
| enum WarningCode : uint64_t { |
| WARNING_NONE = 0, |
| WARNING_DEX_PC_NOT_IN_MAP = 0x1, // A dex pc was found, but it doesn't exist |
| // in any valid map. |
| }; |
| |
| enum ErrorCode : uint8_t { |
| ERROR_NONE, // No error. |
| ERROR_MEMORY_INVALID, // Memory read failed. |
| ERROR_UNWIND_INFO, // Unable to use unwind information to unwind. |
| ERROR_UNSUPPORTED, // Encountered unsupported feature. |
| ERROR_INVALID_MAP, // Unwind in an invalid map. |
| ERROR_MAX_FRAMES_EXCEEDED, // The number of frames exceed the total allowed. |
| ERROR_REPEATED_FRAME, // The last frame has the same pc/sp as the next. |
| ERROR_INVALID_ELF, // Unwind in an invalid elf. |
| ERROR_THREAD_DOES_NOT_EXIST, // Attempt to unwind a local thread that does |
| // not exist. |
| ERROR_THREAD_TIMEOUT, // Timeout trying to unwind a local thread. |
| ERROR_SYSTEM_CALL, // System call failed while unwinding. |
| ERROR_MAX = ERROR_SYSTEM_CALL, |
| }; |
| |
| static inline const char* GetErrorCodeString(ErrorCode error) { |
| switch (error) { |
| case ERROR_NONE: |
| return "None"; |
| case ERROR_MEMORY_INVALID: |
| return "Memory Invalid"; |
| case ERROR_UNWIND_INFO: |
| return "Unwind Info"; |
| case ERROR_UNSUPPORTED: |
| return "Unsupported"; |
| case ERROR_INVALID_MAP: |
| return "Invalid Map"; |
| case ERROR_MAX_FRAMES_EXCEEDED: |
| return "Maximum Frames Exceeded"; |
| case ERROR_REPEATED_FRAME: |
| return "Repeated Frame"; |
| case ERROR_INVALID_ELF: |
| return "Invalid Elf"; |
| case ERROR_THREAD_DOES_NOT_EXIST: |
| return "Thread Does Not Exist"; |
| case ERROR_THREAD_TIMEOUT: |
| return "Thread Timeout"; |
| case ERROR_SYSTEM_CALL: |
| return "System Call Failed"; |
| } |
| } |
| |
| struct ErrorData { |
| ErrorCode code; |
| uint64_t address; // Only valid when code is ERROR_MEMORY_INVALID. |
| // Indicates the failing address. |
| }; |
| |
| } // namespace unwindstack |
| |
| #endif // _LIBUNWINDSTACK_ERROR_H |