我正面临一个问题,我可以看到即使不使用其他线程或其他方法也无法调用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)
请帮助我理解上述行为,我尝试在堆栈溢出中搜索相同的问题,但未获得适当的结果,我还看到执行中跳过了几行,如果条件不位于以下行之前,已执行
79 addr = 7;
(gdb)
81 subaddr2 = 0;
请澄清疑问
答案 0 :(得分:6)
在代码执行期间,调试器的输出用于打印源代码的行号。
由于编译器优化通常意味着对程序的可执行文件进行了更改,以使其可以有效地运行,但是并不需要具有完全相同的文本结构,因此这意味着正在调试的运行程序可能会略有不同比源代码更具代表性。
您的调试器很可能正在执行程序中的不同指令,这些指令映射到同一行源代码,而实际上并没有尝试尝试打开PATH四次。
要生成在结构上更接近源代码表示的可执行文件,请更改编译器的优化器以进行最少的优化。对于gcc,应该选择以下选项:
-O0
这些优化(如果存在)还可以解释为什么某些行似乎被跳过或乱序执行(在两种情况下,您都有可能会看到调试优化代码的时间不够长)。