在开发大型项目时,尤其是多线程情况下,一般无法使用断点调试,这时候将当前函数的调用堆栈打印出来是非常有必要和有效的问题排查手段。
这里记录一段Linux环境下,打印函数堆栈的代码。
void get_native_callstack(std::string &callstack, int level)
{
void* buf[128];
int size = backtrace(buf, sizeof(buf));
char** strings = backtrace_symbols(buf, size);
if (strings != NULL) {
for (int i = 0; i < size; i++) {
callstack.append(strings[i]);
callstack.append("\n");
}
free(strings);
} else {
callstack = "";
}
}
void get_full_callstack(std::string &callstack, int level)
{
return get_native_callstack(callstack, level);
}
使用:
std::string callstack;
get_full_callstack(callstack, 10); //打印10层堆栈