#include <cxxabi.h>
#include <cstdio>
void Exception::fillStackTrace()
{
const int len = 200;
void* buffer[len];
int nptrs = ::backtrace(buffer, len);
char** strings = ::backtrace_symbols(buffer, nptrs);
if (strings)
{
for (int i = 0; i < nptrs; ++i)
{
// TODO demangle funcion name with abi::__cxa_demangle
stack_.append(demangle(strings[i]));
stack_.push_back('\n');
}
free(strings);
}
}
string Exception::demangle(const char *symbol)
{
size_t size = 0;
int status = 0;
char temp[128] = {0};
char *demangled = NULL;
//first, try to demangle a c++ name
if (sscanf(symbol, "%*[^(]%*[^_]%127[^)+]", temp) == 1) {
if ((demangled = abi::__cxa_demangle(temp, NULL, &size,
&status)) != NULL) {
string result(demangled);
free(demangled);
return result;
}
}
//if that didn't work, try to get a regular c symbol
if (sscanf(symbol, "%127s", temp) == 1) {
return temp;
}
//if all else fails, just return the symbol
return symbol;
}
用g++編譯時候加上-rdynamic選項,加入函數符號表才能正確顯示