15f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian/* 25f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * Copyright (C) 2017 The Android Open Source Project 35f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * 45f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 55f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * you may not use this file except in compliance with the License. 65f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * You may obtain a copy of the License at 75f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * 85f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 95f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * 105f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * Unless required by applicable law or agreed to in writing, software 115f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 125f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * See the License for the specific language governing permissions and 145f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian * limitations under the License. 155f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian */ 165f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian 175f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian#pragma once 185f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian 195f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian#include <log/log.h> 205f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian#include <backtrace/Backtrace.h> 215f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian#include <memory> 225f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian 235f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopianclass CallStack { 245f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopianpublic: 255f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian // Create a callstack with the current thread's stack trace. 265f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian // Immediately dump it to logcat using the given logtag. 275f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian static void log(const char* logtag) noexcept { 285f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian std::unique_ptr<Backtrace> backtrace( 295f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 305f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian if (backtrace->Unwind(2)) { 315f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian for (size_t i = 0, c = backtrace->NumFrames(); i < c; i++) { 325f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian __android_log_print(ANDROID_LOG_DEBUG, logtag, "%s", 335f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian backtrace->FormatFrameData(i).c_str()); 345f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian } 355f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian } 365f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian } 375f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian}; 385f1af0457a8a6c2922a0d5e55cb6c248ec539f7fMathias Agopian 39