在Linux系统中,打印调用堆栈(Call Stack)通常用于调试程序,尤其是在程序崩溃或出现异常行为时。调用堆栈显示了程序执行的函数调用序列,从最近的函数调用开始,一直到程序的入口点。
调用堆栈:是一个记录函数调用历史的数据结构。每当一个函数被调用时,它的返回地址、参数和局部变量被推入堆栈。当函数返回时,这些信息被弹出,控制权返回到调用者。
在Linux中,有多种方法可以打印调用堆栈:
backtrace
和 backtrace_symbols
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
void print_trace() {
void *array[10];
size_t size;
char **strings;
size = backtrace(array, 10);
strings = backtrace_symbols(array, size);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
printf("Obtained %zd stack frames.\n", size);
for (size_t i = 0; i < size; i++)
printf("%s\n", strings[i]);
free(strings);
exit(EXIT_SUCCESS);
}
void func3() {
print_trace();
}
void func2() {
func3();
}
void func1() {
func2();
}
int main() {
func1();
return 0;
}
编译并运行这个程序:
gcc -o stack_trace stack_trace.c -rdynamic
./stack_trace
gdb
gdb
运行程序:gdb
运行程序:gdb
中运行程序:gdb
中运行程序:print_trace
函数时,使用 bt
命令打印调用堆栈:print_trace
函数时,使用 bt
命令打印调用堆栈:perf
工具perf
是Linux性能分析工具,也可以用来打印调用堆栈:
sudo perf record -g ./stack_trace
sudo perf report
问题:调用堆栈信息不完整或不准确。
原因:
-g
选项)。-O2
或-O3
),导致函数调用信息被优化掉。解决方法:
通过以上方法,你可以有效地打印和分析Linux程序的调用堆栈,帮助你进行调试和性能优化。
领取专属 10元无门槛券
手把手带您无忧上云