#include <array>
#include <cstddef>
#include <stdexcept>
#include <memory>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
#include <execinfo.h>
#include <cxxabi.h>
#include <iostream>
namespace bliksems {
namespace internal {
std:: string demangle( std:: string const & name) {
int status;
char * res = abi:: __cxa_demangle( name.c_str ( ) , nullptr, nullptr, & status) ;
switch ( status) {
case 0 : {
std:: string result( res) ;
free ( res) ;
return result;
}
case - 1 : throw std:: bad_alloc { } ;
default : return name;
}
}
}
struct stack_frame {
void * address;
std:: string binary;
std:: string function;
std:: size_t offset;
} ;
class exception : public std:: exception {
public :
exception( )
: size{ :: backtrace ( backtrace.data ( ) , backtrace.size ( ) ) } { }
std:: vector < stack_frame> stack_trace( ) const {
std:: unique_ptr < char * , decltype( & :: free ) > symbols
{ backtrace_symbols( backtrace.data ( ) , size) , & :: free } ;
std:: vector < stack_frame> trace;
for ( int i = 0 ; i < size; ++ i) {
std:: istringstream splitter{ symbols.get ( ) [ i] } ;
std:: string ignore;
stack_frame frame;
splitter >> ignore;
splitter >> frame.binary ;
splitter >> frame.address ;
splitter >> frame.function ;
splitter >> ignore;
splitter >> frame.offset ;
frame.function = internal:: demangle ( frame.function ) ;
trace.push_back ( std:: move ( frame) ) ;
}
return trace;
}
private :
int size;
std:: array < void * , 128 > backtrace;
} ;
}
int main( ) {
try {
throw bliksems:: exception { } ;
} catch ( bliksems:: exception const & e) {
for ( auto const & frame : e.stack_trace ( ) ) {
std:: cout
<< frame.binary << " "
<< frame.address << " "
<< frame.function << " + "
<< frame.offset << '\n ' ;
}
std:: cerr << e.what ( ) << '\n ' ;
}
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Y3N0ZGRlZj4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CiNpbmNsdWRlIDxjeHhhYmkuaD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCm5hbWVzcGFjZSBibGlrc2VtcyB7CiAgICBuYW1lc3BhY2UgaW50ZXJuYWwgewogICAgICAgIHN0ZDo6c3RyaW5nIGRlbWFuZ2xlKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7CiAgICAgICAgICAgIGludCBzdGF0dXM7CiAgICAgICAgICAgIGNoYXIgKnJlcyA9IGFiaTo6X19jeGFfZGVtYW5nbGUobmFtZS5jX3N0cigpLCBudWxscHRyLCBudWxscHRyLCAmc3RhdHVzKTsKICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogewogICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdChyZXMpOwogICAgICAgICAgICAgICAgICAgIGZyZWUocmVzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAtMTogdGhyb3cgc3RkOjpiYWRfYWxsb2N7fTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0cnVjdCBzdGFja19mcmFtZSB7CiAgICAgICAgdm9pZCogYWRkcmVzczsKICAgICAgICBzdGQ6OnN0cmluZyBiaW5hcnk7CiAgICAgICAgc3RkOjpzdHJpbmcgZnVuY3Rpb247CiAgICAgICAgc3RkOjpzaXplX3Qgb2Zmc2V0OwogICAgfTsKCiAgICBjbGFzcyBleGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewogICAgcHVibGljOgogICAgICAgIGV4Y2VwdGlvbigpCiAgICAgICAgOiBzaXplezo6YmFja3RyYWNlKGJhY2t0cmFjZS5kYXRhKCksIGJhY2t0cmFjZS5zaXplKCkpfSB7IH0KCiAgICAgICAgc3RkOjp2ZWN0b3I8c3RhY2tfZnJhbWU+IHN0YWNrX3RyYWNlKCkgY29uc3QgewogICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciosIGRlY2x0eXBlKCY6OmZyZWUpPiBzeW1ib2xzCiAgICAgICAgICAgICAgICB7YmFja3RyYWNlX3N5bWJvbHMoYmFja3RyYWNlLmRhdGEoKSwgc2l6ZSksICY6OmZyZWV9OwoKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RhY2tfZnJhbWU+IHRyYWNlOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIHNwbGl0dGVye3N5bWJvbHMuZ2V0KClbaV19OwoKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGlnbm9yZTsKCiAgICAgICAgICAgICAgICBzdGFja19mcmFtZSBmcmFtZTsKICAgICAgICAgICAgICAgIHNwbGl0dGVyID4+IGlnbm9yZTsKICAgICAgICAgICAgICAgIHNwbGl0dGVyID4+IGZyYW1lLmJpbmFyeTsKICAgICAgICAgICAgICAgIHNwbGl0dGVyID4+IGZyYW1lLmFkZHJlc3M7CiAgICAgICAgICAgICAgICBzcGxpdHRlciA+PiBmcmFtZS5mdW5jdGlvbjsKICAgICAgICAgICAgICAgIHNwbGl0dGVyID4+IGlnbm9yZTsKICAgICAgICAgICAgICAgIHNwbGl0dGVyID4+IGZyYW1lLm9mZnNldDsKCiAgICAgICAgICAgICAgICBmcmFtZS5mdW5jdGlvbiA9IGludGVybmFsOjpkZW1hbmdsZShmcmFtZS5mdW5jdGlvbik7CgogICAgICAgICAgICAgICAgdHJhY2UucHVzaF9iYWNrKHN0ZDo6bW92ZShmcmFtZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cmFjZTsKICAgICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgICBpbnQgc2l6ZTsKICAgICAgICBzdGQ6OmFycmF5PHZvaWQqLCAxMjg+IGJhY2t0cmFjZTsKICAgIH07Cn0KCmludCBtYWluKCkgewogICAgdHJ5IHsKICAgICAgICB0aHJvdyBibGlrc2Vtczo6ZXhjZXB0aW9ue307CiAgICB9IGNhdGNoIChibGlrc2Vtczo6ZXhjZXB0aW9uIGNvbnN0JiBlKSB7CiAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBmcmFtZSA6IGUuc3RhY2tfdHJhY2UoKSkgewogICAgICAgICAgICBzdGQ6OmNvdXQKICAgICAgICAgICAgPDwgZnJhbWUuYmluYXJ5IDw8ICIgIgogICAgICAgICAgICA8PCBmcmFtZS5hZGRyZXNzIDw8ICIgIgogICAgICAgICAgICA8PCBmcmFtZS5mdW5jdGlvbiA8PCAiICsgIgogICAgICAgICAgICA8PCBmcmFtZS5vZmZzZXQgPDwgJ1xuJzsKICAgICAgICB9CiAgICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8ICdcbic7CiAgICB9Cn0K
compilation info
prog.cpp: In function 'std::string bliksems::internal::demangle(const std::string&)':
prog.cpp:18:59: error: 'nullptr' was not declared in this scope
prog.cpp: In function 'int main()':
prog.cpp:78:32: error: expected initializer before ':' token
prog.cpp:86:5: error: expected primary-expression before '}' token
prog.cpp:86:5: error: expected ')' before '}' token
prog.cpp:86:5: error: expected primary-expression before '}' token
prog.cpp:86:5: error: expected ';' before '}' token
stdout