#include <iostream>
#include <execinfo.h>
namespace stck {
class stacktrace_t {};
stacktrace_t stacktrace;
std::ostream &operator<<(std::ostream &out, stacktrace_t) {
out << "stacktrace:\n";
size_t max = 256;
void **stackframes = new void *[max];
size_t numel;
while ((numel = backtrace(stackframes, max)) >= max) {
max *= 2;
delete[] stackframes;
stackframes = new void *[max];
}
char **symbols = backtrace_symbols(stackframes, numel);
for(size_t i = 0; i < numel; ++i)
out << symbols[i] << '\n';
delete[] stackframes;
return out;
}
}
int main() {
std::cout << stck::stacktrace;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CgpuYW1lc3BhY2Ugc3RjayB7CgoKY2xhc3Mgc3RhY2t0cmFjZV90IHt9OwoKc3RhY2t0cmFjZV90IHN0YWNrdHJhY2U7CgpzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvdXQsIHN0YWNrdHJhY2VfdCkgewogIG91dCA8PCAic3RhY2t0cmFjZTpcbiI7CiAgCiAgc2l6ZV90IG1heCA9IDI1NjsKICB2b2lkICoqc3RhY2tmcmFtZXMgPSBuZXcgdm9pZCAqW21heF07CiAgc2l6ZV90IG51bWVsOwogIHdoaWxlICgobnVtZWwgPSBiYWNrdHJhY2Uoc3RhY2tmcmFtZXMsIG1heCkpID49IG1heCkgewogICAgbWF4ICo9IDI7CiAgICBkZWxldGVbXSBzdGFja2ZyYW1lczsKICAgIHN0YWNrZnJhbWVzID0gbmV3IHZvaWQgKlttYXhdOwogIH0KICAKICBjaGFyICoqc3ltYm9scyA9IGJhY2t0cmFjZV9zeW1ib2xzKHN0YWNrZnJhbWVzLCBudW1lbCk7CiAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG51bWVsOyArK2kpCiAgICBvdXQgPDwgc3ltYm9sc1tpXSA8PCAnXG4nOwogIAogIGRlbGV0ZVtdIHN0YWNrZnJhbWVzOwogIHJldHVybiBvdXQ7Cn0KCgp9CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCBzdGNrOjpzdGFja3RyYWNlOwoJCn0=