如何停止多次执行c语句?

Sag*_*hel 2 c debugging

我面临一个问题,我可以看到c语句多次执行甚至很难,不是使用其他线程或其他方式调用,

63      BOOLEAN_T DRV_Init(void)
(gdb) n
70          volatile UI32_T                 base_addr = 0;
(gdb)
73          /* Lock interrupt. */
(gdb)
70          volatile UI32_T                 drv_base_addr = 0;
(gdb)
73          /* Lock interrupt. */
(gdb)
75
(gdb)
73          /* Lock interrupt. */
(gdb)
75
(gdb)
79              addr = 7;
(gdb)
81              subaddr2 = 0;
(gdb)
90          /* Open device. */
(gdb)
91          fd = open(PATH, O_RDWR | O_SYNC | O_DSYNC | O_RSYNC);
(gdb)
90          /* Open device. */
(gdb)
91          fd = open(PATH, O_RDWR | O_SYNC | O_DSYNC | O_RSYNC);
(gdb)
92
(gdb)
91          fd = open(PATH, O_RDWR | O_SYNC | O_DSYNC | O_RSYNC);
(gdb)
92
(gdb)
91          fd = open(PATH, O_RDWR | O_SYNC | O_DSYNC | O_RSYNC);
(gdb)
93          if (fd < 0)
(gdb)
90          /* Open device. */
(gdb)
93          if (fd < 0)
Run Code Online (Sandbox Code Playgroud)

请帮助我理解上面的行为,我尝试在堆栈溢出中搜索相同的问题,但没有得到适当的结果,我也看到很少的行在执行中被跳过,我放置了如果条件在下面的行之前没有被执行

79              addr = 7;
(gdb)
81              subaddr2 = 0;
Run Code Online (Sandbox Code Playgroud)

请澄清疑虑

Edw*_*uck 6

调试器的输出具有在代码执行时打印源代码的行号的工作.

由于编译器优化通常意味着程序的可执行文件被更改以使其有效地运行,但不需要具有完全相同的文本结构,这意味着正在调试的正在运行的程序可能具有与源代码.

可能性是你的调试器踩到可执行文件中映射到同一行源代码的不同指令,并且实际上并没有尝试打开PATH四次.

要生成在结构中更接近地表示源代码的可执行文件,请更改编译器的优化程序以进行最小化优化.对于gcc,这应该是选项:

-O0
Run Code Online (Sandbox Code Playgroud)

这些优化(如果存在)也解释了为什么某些行似乎被跳过或无序执行(如果您调试优化代码足够长,则可能会看到这两种情况).