#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选项,加入函数符号表才能正确显示
本文介绍了一个用于填充异常堆栈跟踪的 C++ 函数实现,通过使用 backtrace 和 abi::__cxa_demangle 函数来获取并解析调用堆栈信息。为了使函数名正确解析,编译时需添加 -rdynamic 选项。
371

被折叠的 条评论
为什么被折叠?



