/* system/debuggerd/utility.h ** ** Copyright 2008, 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 _DEBUGGERD_UTILITY_H #define _DEBUGGERD_UTILITY_H #include #include #include // Figure out the abi based on defined macros. #if defined(__arm__) #define ABI_STRING "arm" #elif defined(__aarch64__) #define ABI_STRING "arm64" #elif defined(__mips__) && !defined(__LP64__) #define ABI_STRING "mips" #elif defined(__mips__) && defined(__LP64__) #define ABI_STRING "mips64" #elif defined(__i386__) #define ABI_STRING "x86" #elif defined(__x86_64__) #define ABI_STRING "x86_64" #else #error "Unsupported ABI" #endif struct log_t{ /* tombstone file descriptor */ int tfd; /* Activity Manager socket file descriptor */ int amfd; // The tid of the thread that crashed. pid_t crashed_tid; // The tid of the thread we are currently working with. pid_t current_tid; // logd daemon crash, can block asking for logcat data, allow suppression. bool should_retrieve_logcat; log_t() : tfd(-1), amfd(-1), crashed_tid(-1), current_tid(-1), should_retrieve_logcat(true) {} }; // List of types of logs to simplify the logging decision in _LOG enum logtype { ERROR, HEADER, THREAD, REGISTERS, FP_REGISTERS, BACKTRACE, MAPS, MEMORY, STACK, LOGS }; // Log information onto the tombstone. void _LOG(log_t* log, logtype ltype, const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); int wait_for_sigstop(pid_t, int*, bool*); void dump_memory(log_t* log, Backtrace* backtrace, uintptr_t addr, const char* fmt, ...); bool pid_contains_tid(pid_t pid, pid_t tid); // Attach to a thread, and verify that it's still a member of the given process bool ptrace_attach_thread(pid_t pid, pid_t tid); #endif // _DEBUGGERD_UTILITY_H