1b1994897Sopenharmony_ci/**
2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License.
5b1994897Sopenharmony_ci * You may obtain a copy of the License at
6b1994897Sopenharmony_ci *
7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8b1994897Sopenharmony_ci *
9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and
13b1994897Sopenharmony_ci * limitations under the License.
14b1994897Sopenharmony_ci */
15b1994897Sopenharmony_ci
16b1994897Sopenharmony_ci#ifndef LIBPANDABASE_OS_STACKTRACE_H
17b1994897Sopenharmony_ci#define LIBPANDABASE_OS_STACKTRACE_H
18b1994897Sopenharmony_ci
19b1994897Sopenharmony_ci#include <vector>
20b1994897Sopenharmony_ci#include <iostream>
21b1994897Sopenharmony_ci
22b1994897Sopenharmony_cinamespace panda {
23b1994897Sopenharmony_ci
24b1994897Sopenharmony_ciclass StackPrinterImpl;
25b1994897Sopenharmony_ci
26b1994897Sopenharmony_ci/*
27b1994897Sopenharmony_ci * Return stack trace as a vector of PCs
28b1994897Sopenharmony_ci *
29b1994897Sopenharmony_ci * Use std::vector instead of PandaVector due to have ability
30b1994897Sopenharmony_ci * to print stack traces in internal allocator.
31b1994897Sopenharmony_ci * Since PandaVector uses internal allocator it leads to
32b1994897Sopenharmony_ci * infinite recursion.
33b1994897Sopenharmony_ci */
34b1994897Sopenharmony_cistd::vector<uintptr_t> GetStacktrace();
35b1994897Sopenharmony_ci
36b1994897Sopenharmony_ci/*
37b1994897Sopenharmony_ci * Print stack trace provided into 'Print' function.
38b1994897Sopenharmony_ci * The class caches information. So it is aimed to be used
39b1994897Sopenharmony_ci * to print multiple stack traces.
40b1994897Sopenharmony_ci */
41b1994897Sopenharmony_cistd::ostream &PrintStack(const std::vector<uintptr_t> &stacktrace, std::ostream &out);
42b1994897Sopenharmony_ci
43b1994897Sopenharmony_ci/*
44b1994897Sopenharmony_ci * Print stack trace
45b1994897Sopenharmony_ci */
46b1994897Sopenharmony_ci// NOLINTNEXTLINE(misc-definitions-in-headers)
47b1994897Sopenharmony_ciinline std::ostream &PrintStack(std::ostream &out)
48b1994897Sopenharmony_ci{
49b1994897Sopenharmony_ci    return PrintStack(GetStacktrace(), out);
50b1994897Sopenharmony_ci}
51b1994897Sopenharmony_ci
52b1994897Sopenharmony_ci}  // namespace panda
53b1994897Sopenharmony_ci
54b1994897Sopenharmony_ci#endif  // LIBPANDABASE_OS_STACKTRACE_H
55