写在前面:又到周末啦~上上周忍痛买了个雅马哈声卡和 AKG 话筒,这周六才正式打开试用了下,效果还不错,我自己还挺享受的。不过这玩意儿太高端,还不会用 AI 调音。小伙伴们感觉下这首加了一点点电音效果的歌曲如何呢等我慢慢摸熟了,后面更文的频率可能会高些吧,哈哈哈。
除了使用 GDB 启动调试、暂停/恢复程序执行和查看变量外,另外一个重要的调试方法便是查看程序的函数调用堆栈情况。
调用堆栈是当前函数之前的所有已调用函数的列表,每个函数及其变量都被分配了一个 "栈帧",使用 GDB 查看函数调用堆栈可清晰地看到各个函数的调用顺序以及各函数的输入形参值,是分析程序的执行流程和输入依赖的重要手段。
为了便于讲解,本文基于下述通过递归算法计算斐波拉契数列的简单 demo 进行举例说明。
#include<stdio.h>
#include<stdlib.h>
int fibonacci(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
int i = n; // only for showing local variable in GDB
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main()
{
int n = 10;
int ret = 0;
ret = fibonacci(n);
printf("fibonacci(%d)=%d\n", n, ret);
return 0;
}
1. backtrace 命令
要查看当前的堆栈信息,可使用 backtrace
命令 (缩写形式 bt
)。堆栈中的每个函数都被分配了一个编号,最近被调用的函数在 0 号帧中 (栈顶)。
backtrace n
表示只打印栈顶上 n 层的栈信息 (n 表示一