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 | |
---|
17 | namespace 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 | |
---|
36 | namespace 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 | |
---|
58 | namespace 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.