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