c语言创建静态变量时
When static variables are created in c language
这里gdb不会停在Line:4。
接下来,
没有点击 Line:5 处的声明行,变量 x 已存在并已初始化。
接下来,
但这里显示超出范围(是的,根据我的说法应该如此)。
现在,我对这个特定的 c 程序实例有以下疑问。
- P1() 中变量 x 的内存何时被创建和初始化?
- 为什么 gdb 在第一个例子中没有在 P1() 内部的静态声明语句处停止?
- 如果我们再次调用P1(),程序控制会直接跳过声明语句吗?
已经解释了(在问题下方评论中链接的相关主题中)静态变量是如何工作的。
这是 gcc 为您的 p1 函数生成的实际代码(通过 gcc -c -O0 -fomit-frame-pointer -g3 staticvar.c -o staticvar.o)然后用相关源反汇编.
Disassembly of section .text:
0000000000000000 <p1>:
#include <stdio.h>
void p1(void)
{
0: 48 83 ec 08 sub [=10=]x8,%rsp
static int x = 10;
x += 5;
4: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # a <p1+0xa>
a: 83 c0 05 add [=10=]x5,%eax
d: 89 05 00 00 00 00 mov %eax,0x0(%rip) # 13 <p1+0x13>
printf("%d\n", x);
13: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 19 <p1+0x19>
19: 89 c6 mov %eax,%esi
1b: bf 00 00 00 00 mov [=10=]x0,%edi
20: b8 00 00 00 00 mov [=10=]x0,%eax
25: e8 00 00 00 00 callq 2a <p1+0x2a>
}
2a: 90 nop
2b: 48 83 c4 08 add [=10=]x8,%rsp
2f: c3 retq
因此,如您所见,没有用于声明 x 的代码。 GDB 只能在实际的机器代码指令处中断,因为存在 none,它在下一条指令 (mov) 处中断,该指令与第 5 行匹配。
这里gdb不会停在Line:4。
接下来,
没有点击 Line:5 处的声明行,变量 x 已存在并已初始化。
接下来,
但这里显示超出范围(是的,根据我的说法应该如此)。
现在,我对这个特定的 c 程序实例有以下疑问。
- P1() 中变量 x 的内存何时被创建和初始化?
- 为什么 gdb 在第一个例子中没有在 P1() 内部的静态声明语句处停止?
- 如果我们再次调用P1(),程序控制会直接跳过声明语句吗?
已经解释了(在问题下方评论中链接的相关主题中)静态变量是如何工作的。
这是 gcc 为您的 p1 函数生成的实际代码(通过 gcc -c -O0 -fomit-frame-pointer -g3 staticvar.c -o staticvar.o)然后用相关源反汇编.
Disassembly of section .text:
0000000000000000 <p1>:
#include <stdio.h>
void p1(void)
{
0: 48 83 ec 08 sub [=10=]x8,%rsp
static int x = 10;
x += 5;
4: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # a <p1+0xa>
a: 83 c0 05 add [=10=]x5,%eax
d: 89 05 00 00 00 00 mov %eax,0x0(%rip) # 13 <p1+0x13>
printf("%d\n", x);
13: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 19 <p1+0x19>
19: 89 c6 mov %eax,%esi
1b: bf 00 00 00 00 mov [=10=]x0,%edi
20: b8 00 00 00 00 mov [=10=]x0,%eax
25: e8 00 00 00 00 callq 2a <p1+0x2a>
}
2a: 90 nop
2b: 48 83 c4 08 add [=10=]x8,%rsp
2f: c3 retq
因此,如您所见,没有用于声明 x 的代码。 GDB 只能在实际的机器代码指令处中断,因为存在 none,它在下一条指令 (mov) 处中断,该指令与第 5 行匹配。