使用c语言

时间:2016-12-15 06:04:13

标签: c static gdb allocation

这里gdb不会停在Line:4。

enter image description here

接下来,

如果没有按Line:5处的声明行,变量x就会存在并初始化。

enter image description here

接下来,

但是这里显示超出范围(是的,它应该根据我)。

enter image description here

现在,我对c程序的这个特定实例有以下疑问。

  1. 什么时候创建并初始化P1()中变量x的内存?
  2. 为什么gdb没有在第一个例子中的P1()内部的静态声明语句处停止?
  3. 如果再次调用P1(),程序控件是否会跳过声明语句?

1 个答案:

答案 0 :(得分:1)

已经解释了(在下面的问题中的评论中链接的相关主题)静态变量如何工作。

这是由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    $0x8,%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    $0x5,%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    $0x0,%edi
  20:   b8 00 00 00 00          mov    $0x0,%eax
  25:   e8 00 00 00 00          callq  2a <p1+0x2a>
}
  2a:   90                      nop
  2b:   48 83 c4 08             add    $0x8,%rsp
  2f:   c3                      retq   

因此,正如您所看到的,没有用于声明x的代码。 GDB只能在实际的机器代码指令中断,因为没有,它会在与第5行匹配的下一条指令(mov)上中断。