| 95 | } |
| 96 | |
| 97 | Execution::Trace Execution::stackTrace(int maxDepth, int skip) |
| 98 | { |
| 99 | Trace t; |
| 100 | auto &data = TracePrivate::get(t); |
| 101 | #ifdef USE_BACKWARD_CPP |
| 102 | data.load_here(maxDepth); |
| 103 | // skip 3: 2 calls in backward-cpp, plus this method |
| 104 | // however, don't skip more frames than we actually got, as that confuses backward-cpp massively |
| 105 | // (this can happen in release builds on ARM apparently) |
| 106 | data.skip_n_firsts(std::min(data.size(), skip + data.skip_n_firsts() + 3)); |
| 107 | #elif defined(HAVE_BACKTRACE) |
| 108 | data.resize(maxDepth); |
| 109 | const auto size = backtrace(data.data(), maxDepth); |
| 110 | if (size <= 0) |
| 111 | data.clear(); |
| 112 | else |
| 113 | data.resize(size); |
| 114 | data.remove(0, skip + 1); // skip 1: this method |
| 115 | #else |
| 116 | Q_UNUSED(maxDepth); |
| 117 | Q_UNUSED(skip); |
| 118 | #endif |
| 119 | return t; |
| 120 | } |
| 121 | |
| 122 | #ifdef USE_BACKWARD_CPP |
| 123 | static backward::TraceResolver *resolver() |