2022-08-14 02:36:53 +02:00
|
|
|
#pragma once
|
|
|
|
#include <util/types.hpp>
|
|
|
|
#include <util/logs.hpp>
|
|
|
|
|
|
|
|
namespace utils
|
|
|
|
{
|
2022-12-17 12:19:19 +01:00
|
|
|
namespace stack_trace
|
|
|
|
{
|
|
|
|
// Printing utilities
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
concept Logger = requires (T& t, const std::string& msg)
|
|
|
|
{
|
|
|
|
{ t.print(msg) };
|
|
|
|
};
|
|
|
|
|
|
|
|
struct print_to_log
|
|
|
|
{
|
|
|
|
logs::channel& log;
|
|
|
|
|
|
|
|
public:
|
|
|
|
print_to_log(logs::channel& chan)
|
|
|
|
: log(chan)
|
|
|
|
{}
|
|
|
|
|
|
|
|
void print(const std::string& s)
|
|
|
|
{
|
|
|
|
log.error("%s", s);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-08-14 19:25:52 +02:00
|
|
|
std::vector<void*> get_backtrace(int max_depth = 255);
|
|
|
|
std::vector<std::string> get_backtrace_symbols(const std::vector<void*>& stack);
|
2022-08-14 02:36:53 +02:00
|
|
|
|
2022-12-17 12:19:19 +01:00
|
|
|
FORCE_INLINE void print_trace(stack_trace::Logger auto& logger, int max_depth = 255)
|
2022-08-14 02:36:53 +02:00
|
|
|
{
|
2022-08-14 19:25:52 +02:00
|
|
|
const auto trace = get_backtrace(max_depth);
|
|
|
|
const auto lines = get_backtrace_symbols(trace);
|
2022-08-14 02:36:53 +02:00
|
|
|
|
|
|
|
for (const auto& line : lines)
|
|
|
|
{
|
2022-12-17 12:19:19 +01:00
|
|
|
logger.print(line);
|
2022-08-14 02:36:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|