source: XIOS3/trunk/extern/cpptrace/src/cpptrace.cpp

Last change on this file was 2573, checked in by ymipsl, 10 months ago

create new external source lib : cpptrace, for statck trace output
YM

File size: 2.8 KB
Line 
1#include "cpptrace.hpp"
2
3#include <cstddef>
4#include <cstdint>
5#include <string>
6#include <vector>
7#include <iomanip>
8#include <iostream>
9
10#if !(defined(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE) || defined(CPPTRACE_FULL_TRACE_WITH_STACKTRACE))
11
12#include "symbols.hpp"
13#include "unwind.hpp"
14#include "demangle.hpp"
15#include "common.hpp"
16
17namespace cpptrace {
18    CPPTRACE_FORCE_NO_INLINE CPPTRACE_API
19    std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
20        std::vector<void*> frames = detail::capture_frames(skip + 1);
21        std::vector<stacktrace_frame> trace = detail::resolve_frames(frames);
22        for(auto& frame : trace) {
23            frame.symbol = detail::demangle(frame.symbol);
24        }
25        return trace;
26    }
27}
28
29#else
30
31// full trace
32
33#include "full_trace.hpp"
34#include "demangle.hpp"
35
36namespace cpptrace {
37    CPPTRACE_FORCE_NO_INLINE CPPTRACE_API
38    std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
39        auto trace = detail::generate_trace(skip + 1);
40        for(auto& entry : trace) {
41            entry.symbol = detail::demangle(entry.symbol);
42        }
43        return trace;
44    }
45}
46
47#endif
48
49#define ESC     "\033["
50#define RESET   ESC "0m"
51#define RED     ESC "31m"
52#define GREEN   ESC "32m"
53#define YELLOW  ESC "33m"
54#define BLUE    ESC "34m"
55#define MAGENTA ESC "35m"
56#define CYAN    ESC "36m"
57
58namespace cpptrace {
59    CPPTRACE_API
60    void print_trace(std::uint32_t skip) {
61        enable_virtual_terminal_processing_if_needed();
62        std::cerr<<"Stack trace (most recent call first):"<<std::endl;
63        std::size_t counter = 0;
64        const auto trace = generate_trace(skip + 1);
65        if(trace.empty()) {
66            std::cerr<<"<empty trace>"<<std::endl;
67            return;
68        }
69        const auto frame_number_width = n_digits(static_cast<int>(trace.size()) - 1);
70        for(const auto& frame : trace) {
71            std::cerr
72                << '#'
73                << std::setw(static_cast<int>(frame_number_width))
74                << std::left
75                << counter++
76                << std::right
77                << " "
78                << std::hex
79                << BLUE
80                << "0x"
81                << std::setw(2 * sizeof(uintptr_t))
82                << std::setfill('0')
83                << frame.address
84                << std::dec
85                << std::setfill(' ')
86                << RESET
87                << " in "
88                << YELLOW
89                << frame.symbol
90                << RESET
91                << " at "
92                << GREEN
93                << frame.filename
94                << RESET
95                << ":"
96                << BLUE
97                << frame.line
98                << RESET
99                << (frame.col > 0 ? ":" BLUE + std::to_string(frame.col) + RESET : "")
100                << std::endl;
101        }
102    }
103}
Note: See TracBrowser for help on using the repository browser.