gdb练习7——打印尾调用堆栈帧信息
测试代码
#include <stdio.h>
void a() {
printf("Tail call frame\n");
}
void b() {
a();
}
void c() {
b();
}
int main (int argc, char *argv[]) {
c();
return 0;
}
测试过程
当一个函数最后一条指令是调用另外一个函数时,
开启优化选项的编译器常常以最后被调用的函数返回值作为调用者的返回值,这称为尾调用
编译程序时,使用-O
使用命令disassemble main查看main函数的汇编代码,
可以看到,main函数直接调用了函数a,根本看不到函数b和c
此处,在函数a的入口处打上断点,在程序停止后,打印堆栈帧信息
i frame
看不到尾调用的相关信息
可以设置
set debug entry-values 1
,这样,除了输出正常的函数堆栈帧信息外,还可以输出尾调用的相关信息