提交 d00feca2 编写于 作者: cosmicing's avatar cosmicing

Add new file

上级 c04b215c
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
// backtrace()
#include <execinfo.h>
// __cxa_demangle()
#include <cxxabi.h>
using std::string;
using std::vector;
vector<string> get_backtrace10() {
// backtrace()
const int trace_size = 10;
void* trace[trace_size];
int size = backtrace(trace, trace_size);
// backtrace_symbols()
char** symbols = backtrace_symbols(trace, size);
vector<string> result(symbols, symbols + size);
free(symbols);
return result;
}
string cut_function_name_part(const string& raw_text) {
string::size_type left = raw_text.find("(");
string::size_type right = raw_text.find("+", left + 1);
return
(left == raw_text.npos || right == raw_text.npos)
? ""
: raw_text.substr(left + 1, right - left - 1);
}
string demangle_function_name(const string& mangled) {
// __cxa_demangle()
int status = 0;
char* demangled = abi::__cxa_demangle(mangled.c_str(), 0, 0, &status);
// demangled
string result = demangled ? demangled : mangled;
free(demangled);
if (status != 0) {
std::ostringstream oss;
oss << " [error:status=" << status << "]";
result += oss.str();
}
return result;
}
void f3() {
vector<string> backtrace_texts = get_backtrace10();
std::cout << "Backtrace:\n";
for (vector<string>::const_iterator
it = backtrace_texts.begin(), end = backtrace_texts.end();
it != end;
++it) {
string mangled_func_name = cut_function_name_part(*it);
std::cout
<< ((!mangled_func_name.empty())
? demangle_function_name(mangled_func_name)
: "???")
<< ": " << *it << "\n";
}
}
void f2() { f3(); }
void f1() { f2(); }
int main() { f1(); }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册