gpt4 book ai didi

c - main() 递归调用 main() - gdb 回溯不显示多个 main() 帧 - 为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:46 29 4
gpt4 key购买 nike

我在 main() 中调用 main(),递归 10 次。现在,在使用 gdb (bt/backtrace) 进行调试时,我没有看到 main() 的多个帧。为什么?

#include<stdio.h>

int main(){

static int i;
int num=100;

if(i>10)
return 0;
else {
i++;
num++;
main();
printf("\n%d",num);
}
}

最佳答案

这是记录在案的 gdb 行为,它 is (supposed to be) configurable .

当我使用 gcc 4.7.2 (-O3) 编译您的代码时,我得到以下程序集:

_main:
LFB1:
movl _i.2134(%rip), %eax
cmpl $10, %eax
jle L6
xorl %eax, %eax
ret
L6:
addl $1, %eax
pushq %rdx
LCFI0:
movl %eax, _i.2134(%rip)
xorl %eax, %eax
call _main ; <=== recursive call
popq %rcx
LCFI1:
movl $101, %esi
xorl %eax, %eax
leaq LC0(%rip), %rdi
jmp _printf
LFE1:

这驳斥了递归调用被优化掉的假设。

现在,如果我将二进制文件加载到 gdb 并在 main() 上设置断点,它会被反复命中。当我检查寄存器时,%rsp 会随着每次调用而递减,因此显然有与每个 main() 关联的堆栈帧。

尽管如此,bt 只显示一帧:

(gdb) bt
#0 0x0000000100000f50 in main ()

(在这种情况下,我知道有三个 main() 框架,而不仅仅是一个。)

因此我得出结论,这与 gdb 本身有关。

经过进一步调查,发现这个行为是documented :

Most programs have a standard user entry point—a place where system libraries and startup code transition into user code. For C this is main. When gdb finds the entry function in a backtrace it will terminate the backtrace, to avoid tracing into highly system-specific (and generally uninteresting) code.

当我在 gdb 中设置以下内容时:

set backtrace past-main on
set backtrace past-entry on

它开始显示两个 main() 框架。出于某种原因,它仍然没有更深入。

关于c - main() 递归调用 main() - gdb 回溯不显示多个 main() 帧 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949665/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com