gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:47:58 31 4
gpt4 key购买 nike

我面临一个问题,我可以看到 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)

请帮助我理解上述行为,我尝试在堆栈溢出中搜索相同的问题但没有得到适当的结果,而且我看到在执行过程中跳过了一些行,我将 if 条件放在下面的行之前执行

79              addr = 7;
(gdb)
81 subaddr2 = 0;

请解惑

最佳答案

调试器的输出有打印源代码行号的工作,同时代码正在执行。

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

很可能您的调试器正在跨过可执行文件中映射到同一行源代码的不同指令,并且实际上并没有尝试四次打开 PATH。

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

-O0

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

关于c - 如何停止多次执行的c语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52857329/

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