1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker *
4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker *
8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker *
10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker */
16*eb293b8fSAndroid Build Coastguard Worker
17*eb293b8fSAndroid Build Coastguard Worker #pragma once
18*eb293b8fSAndroid Build Coastguard Worker
19*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
20*eb293b8fSAndroid Build Coastguard Worker
21*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker // A bit map of warnings, multiple warnings can be set at the same time.
24*eb293b8fSAndroid Build Coastguard Worker enum WarningCode : uint64_t {
25*eb293b8fSAndroid Build Coastguard Worker WARNING_NONE = 0,
26*eb293b8fSAndroid Build Coastguard Worker WARNING_DEX_PC_NOT_IN_MAP = 0x1, // A dex pc was found, but it doesn't exist
27*eb293b8fSAndroid Build Coastguard Worker // in any valid map.
28*eb293b8fSAndroid Build Coastguard Worker };
29*eb293b8fSAndroid Build Coastguard Worker
30*eb293b8fSAndroid Build Coastguard Worker enum ErrorCode : uint8_t {
31*eb293b8fSAndroid Build Coastguard Worker ERROR_NONE, // No error.
32*eb293b8fSAndroid Build Coastguard Worker ERROR_MEMORY_INVALID, // Memory read failed.
33*eb293b8fSAndroid Build Coastguard Worker ERROR_UNWIND_INFO, // Unable to use unwind information to unwind.
34*eb293b8fSAndroid Build Coastguard Worker ERROR_UNSUPPORTED, // Encountered unsupported feature.
35*eb293b8fSAndroid Build Coastguard Worker ERROR_INVALID_MAP, // Unwind in an invalid map.
36*eb293b8fSAndroid Build Coastguard Worker ERROR_MAX_FRAMES_EXCEEDED, // The number of frames exceed the total allowed.
37*eb293b8fSAndroid Build Coastguard Worker ERROR_REPEATED_FRAME, // The last frame has the same pc/sp as the next.
38*eb293b8fSAndroid Build Coastguard Worker ERROR_INVALID_ELF, // Unwind in an invalid elf.
39*eb293b8fSAndroid Build Coastguard Worker ERROR_THREAD_DOES_NOT_EXIST, // Attempt to unwind a local thread that does
40*eb293b8fSAndroid Build Coastguard Worker // not exist.
41*eb293b8fSAndroid Build Coastguard Worker ERROR_THREAD_TIMEOUT, // Timeout trying to unwind a local thread.
42*eb293b8fSAndroid Build Coastguard Worker ERROR_SYSTEM_CALL, // System call failed while unwinding.
43*eb293b8fSAndroid Build Coastguard Worker ERROR_BAD_ARCH, // Arch invalid (none, or mismatched).
44*eb293b8fSAndroid Build Coastguard Worker ERROR_MAPS_PARSE, // Failed to parse maps data.
45*eb293b8fSAndroid Build Coastguard Worker ERROR_INVALID_PARAMETER, // Invalid parameter passed to function.
46*eb293b8fSAndroid Build Coastguard Worker ERROR_PTRACE_CALL, // Ptrace call failed while unwinding.
47*eb293b8fSAndroid Build Coastguard Worker ERROR_MAX = ERROR_INVALID_PARAMETER,
48*eb293b8fSAndroid Build Coastguard Worker };
49*eb293b8fSAndroid Build Coastguard Worker
GetErrorCodeString(ErrorCode error)50*eb293b8fSAndroid Build Coastguard Worker static inline const char* GetErrorCodeString(ErrorCode error) {
51*eb293b8fSAndroid Build Coastguard Worker switch (error) {
52*eb293b8fSAndroid Build Coastguard Worker case ERROR_NONE:
53*eb293b8fSAndroid Build Coastguard Worker return "None";
54*eb293b8fSAndroid Build Coastguard Worker case ERROR_MEMORY_INVALID:
55*eb293b8fSAndroid Build Coastguard Worker return "Memory Invalid";
56*eb293b8fSAndroid Build Coastguard Worker case ERROR_UNWIND_INFO:
57*eb293b8fSAndroid Build Coastguard Worker return "Unwind Info";
58*eb293b8fSAndroid Build Coastguard Worker case ERROR_UNSUPPORTED:
59*eb293b8fSAndroid Build Coastguard Worker return "Unsupported";
60*eb293b8fSAndroid Build Coastguard Worker case ERROR_INVALID_MAP:
61*eb293b8fSAndroid Build Coastguard Worker return "Invalid Map";
62*eb293b8fSAndroid Build Coastguard Worker case ERROR_MAX_FRAMES_EXCEEDED:
63*eb293b8fSAndroid Build Coastguard Worker return "Maximum Frames Exceeded";
64*eb293b8fSAndroid Build Coastguard Worker case ERROR_REPEATED_FRAME:
65*eb293b8fSAndroid Build Coastguard Worker return "Repeated Frame";
66*eb293b8fSAndroid Build Coastguard Worker case ERROR_INVALID_ELF:
67*eb293b8fSAndroid Build Coastguard Worker return "Invalid Elf";
68*eb293b8fSAndroid Build Coastguard Worker case ERROR_THREAD_DOES_NOT_EXIST:
69*eb293b8fSAndroid Build Coastguard Worker return "Thread Does Not Exist";
70*eb293b8fSAndroid Build Coastguard Worker case ERROR_THREAD_TIMEOUT:
71*eb293b8fSAndroid Build Coastguard Worker return "Thread Timeout";
72*eb293b8fSAndroid Build Coastguard Worker case ERROR_SYSTEM_CALL:
73*eb293b8fSAndroid Build Coastguard Worker return "System Call Failed";
74*eb293b8fSAndroid Build Coastguard Worker case ERROR_BAD_ARCH:
75*eb293b8fSAndroid Build Coastguard Worker return "Invalid arch detected";
76*eb293b8fSAndroid Build Coastguard Worker case ERROR_MAPS_PARSE:
77*eb293b8fSAndroid Build Coastguard Worker return "Failed to parse maps";
78*eb293b8fSAndroid Build Coastguard Worker case ERROR_INVALID_PARAMETER:
79*eb293b8fSAndroid Build Coastguard Worker return "Invalid parameter";
80*eb293b8fSAndroid Build Coastguard Worker case ERROR_PTRACE_CALL:
81*eb293b8fSAndroid Build Coastguard Worker return "Ptrace Call Failed";
82*eb293b8fSAndroid Build Coastguard Worker }
83*eb293b8fSAndroid Build Coastguard Worker }
84*eb293b8fSAndroid Build Coastguard Worker
85*eb293b8fSAndroid Build Coastguard Worker struct ErrorData {
86*eb293b8fSAndroid Build Coastguard Worker ErrorCode code;
87*eb293b8fSAndroid Build Coastguard Worker uint64_t address; // Only valid when code is ERROR_MEMORY_INVALID.
88*eb293b8fSAndroid Build Coastguard Worker // Indicates the failing address.
89*eb293b8fSAndroid Build Coastguard Worker };
90*eb293b8fSAndroid Build Coastguard Worker
91*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack
92