函數原型
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();
}
參考資料: