File indexing completed on 2025-02-16 05:12:10

0001 #include <backward/backward.hpp>
0002 #include <iostream>
0003 #include <sstream>
0004 #include <stdexcept>
0005 
0006 using namespace backward;
0007 
0008 class TracedException : public std::runtime_error {
0009 public:
0010   TracedException() : std::runtime_error(_get_trace()) {}
0011 
0012 private:
0013   std::string _get_trace() {
0014     std::ostringstream ss;
0015 
0016     StackTrace stackTrace;
0017     TraceResolver resolver;
0018     stackTrace.load_here();
0019     resolver.load_stacktrace(stackTrace);
0020 
0021     for (std::size_t i = 0; i < stackTrace.size(); ++i) {
0022       const ResolvedTrace trace = resolver.resolve(stackTrace[i]);
0023 
0024       ss << "#" << i << " at " << trace.object_function << "\n";
0025     }
0026 
0027     return ss.str();
0028   }
0029 };
0030 
0031 void f(int i) {
0032   if (i >= 42) {
0033     throw TracedException();
0034   } else {
0035     std::cout << "i=" << i << "\n";
0036     f(i + 1);
0037   }
0038 }
0039 
0040 int main() {
0041   try {
0042     f(0);
0043   } catch (const TracedException &ex) {
0044     std::cout << ex.what();
0045   }
0046 }