1ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 2ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Copyright (C) 2013 The Android Open Source Project 3ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 4ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * you may not use this file except in compliance with the License. 6ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * You may obtain a copy of the License at 7ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 8ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 10ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * See the License for the specific language governing permissions and 14ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * limitations under the License. 15ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 16ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 17ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#ifndef ANDROID_PROCESS_CALLSTACK_H 18ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#define ANDROID_PROCESS_CALLSTACK_H 19ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 20ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/CallStack.h> 21ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <android/log.h> 22ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/KeyedVector.h> 23ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/String8.h> 24ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 25ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <time.h> 26ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <sys/types.h> 27ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 28ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinnamespace android { 29ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 30ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass Printer; 31ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 32ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Collect/print the call stack (function, file, line) traces for all threads in a process. 33ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass ProcessCallStack { 34ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic: 35ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Create an empty call stack. No-op. 36ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ProcessCallStack(); 37ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Copy the existing process callstack (no other side effects). 38ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ProcessCallStack(const ProcessCallStack& rhs); 39ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ~ProcessCallStack(); 40ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 41ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Immediately collect the stack traces for all threads. 429b0e074c6d38143e01616404a08b0c7aa992f3c3Christopher Ferris void update(); 43ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 44ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Print all stack traces to the log using the supplied logtag. 45ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin void log(const char* logtag, android_LogPriority priority = ANDROID_LOG_DEBUG, 46ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin const char* prefix = 0) const; 47ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 48ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Dump all stack traces to the specified file descriptor. 49ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin void dump(int fd, int indent = 0, const char* prefix = 0) const; 50ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 51ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Return a string (possibly very long) containing all the stack traces. 52ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin String8 toString(const char* prefix = 0) const; 53ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 54ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Dump a serialized representation of all the stack traces to the specified printer. 55ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin void print(Printer& printer) const; 56ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 57ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Get the number of threads whose stack traces were collected. 58ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin size_t size() const; 59ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 60ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprivate: 61ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin void printInternal(Printer& printer, Printer& csPrinter) const; 62ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 63ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Reset the process's stack frames and metadata. 64ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin void clear(); 65ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 66ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin struct ThreadInfo { 67ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin CallStack callStack; 68ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin String8 threadName; 69ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin }; 70ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 71ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // tid -> ThreadInfo 72ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin KeyedVector<pid_t, ThreadInfo> mThreadMap; 73ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Time that update() was last called 74ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin struct tm mTimeUpdated; 75ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; 76ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 77ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // namespace android 78ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 79ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#endif // ANDROID_PROCESS_CALLSTACK_H 80