source: XIOS3/trunk/extern/cpptrace/src/symbols_core.cpp @ 2573

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

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

File size: 1.9 KB
Line 
1#include "symbols.hpp"
2
3#include <vector>
4
5namespace cpptrace {
6    namespace detail {
7        void apply_trace(
8            std::vector<stacktrace_frame>& result,
9            std::vector<stacktrace_frame>&& trace
10        ) {
11            for(std::size_t i = 0; i < result.size(); i++) {
12                if(result[i].address == 0) {
13                    result[i].address = trace[i].address;
14                }
15                if(result[i].line == 0) {
16                    result[i].line = trace[i].line;
17                }
18                if(result[i].col == 0) {
19                    result[i].col = trace[i].col;
20                }
21                if(result[i].filename.empty()) {
22                    result[i].filename = std::move(trace[i].filename);
23                }
24                if(result[i].symbol.empty()) {
25                    result[i].symbol = std::move(trace[i].symbol);
26                }
27            }
28        }
29
30        std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
31            std::vector<stacktrace_frame> trace(frames.size());
32            #ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDL
33            apply_trace(trace, libdl::resolve_frames(frames));
34            #endif
35            #ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF
36            apply_trace(trace, libdwarf::resolve_frames(frames));
37            #endif
38            #ifdef CPPTRACE_GET_SYMBOLS_WITH_DBGHELP
39            apply_trace(trace, dbghelp::resolve_frames(frames));
40            #endif
41            #ifdef CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE
42            apply_trace(trace, addr2line::resolve_frames(frames));
43            #endif
44            #ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE
45            apply_trace(trace, libbacktrace::resolve_frames(frames));
46            #endif
47            #ifdef CPPTRACE_GET_SYMBOLS_WITH_NOTHING
48            apply_trace(trace, nothing::resolve_frames(frames));
49            #endif
50            return trace;
51        }
52    }
53}
Note: See TracBrowser for help on using the repository browser.