函数原型
int backtrace(void **buffer, int size);
返回调用堆栈
buffer :提供一个指针的数组
size :指定缓冲区的个数,即设置的调用深度
int : 返回实际返回的调用深度
每个地址指针由 函数名、地址偏移、返回地址组成
char **backtrace_symbols(void *const *buffer, int size);
字符串结果通过该API返回,会在该函数中malloc,由我们free
使用方法
void Backtrace(std::vector<std::string>& bt, int size, int skip) {
void** array = (void**)malloc((sizeof(void*) * size));
size_t s = ::backtrace(array, size);
char** strings = backtrace_symbols(array, s);
if (strings == NULL) {
SYLAR_LOG_ERROR(g_logger) << "backtrace_synbols error";
return;
}
for (size_t i = skip; i < s; ++i) {
bt.push_back(demangle(strings[i]));
}
free(strings);
free(array);
}
std::string BacktraceToString(int size, int skip, const std::string& prefix) {
std::vector<std::string> bt;
Backtrace(bt, size, skip);
std::stringstream ss;
for (size_t i = 0; i < bt.size(); ++i) {
ss << prefix << bt[i] << std::endl;
}
return ss.str();
}
参考资料: