首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的断点没有按顺序运行?GCC与C

为什么我的断点没有按顺序运行?GCC与C
EN

Stack Overflow用户
提问于 2013-01-23 05:43:05
回答 2查看 152关注 0票数 1

我正在使用调试器。我正在做的实际任务是观察指令指针在我运行代码时是如何变化的。

然而,我在理解其他东西时遇到了困难。我在第6行、strcpy (在第7行)和第8行设置了断点。在设置了断点之后,我运行它。

为什么它会以不同的顺序遍历断点?断点2、断点1和断点3?

我的另一个问题是。断点1设置在第6行,但当我们到达该断点时,它会显示"char_array2.c:7“。我知道第6行是空的,那么在读取第7行的任何部分之前,断点是否会停止?

代码语言:javascript
复制
(gdb) list
1   #include <stdio.h>
2   #include <string.h>
3   
4   int main() {
5      char str_a[20];
6   
7      strcpy(str_a, "Hello World!\n");
8      printf(str_a);
9   }
(gdb) 
Line number 10 out of range; char_array2.c has 9 lines.
(gdb) break 6
Breakpoint 1 at 0x100000ec8: file char_array2.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x20c49ba5c77e20
(gdb) break 8
Breakpoint 3 at 0x100000edd: file char_array2.c, line 8.
(gdb) run
Starting program: /Users/Guest1/Desktop/Hacking files/char_array2 
Reading symbols for shared libraries +. done

Breakpoint 2, 0x00007fff8601ce20 in strcpy ()
(gdb) continue
Continuing.

Breakpoint 1, main () at char_array2.c:7
7      strcpy(str_a, "Hello World!\n");
(gdb) continue
Continuing.

Breakpoint 3, main () at char_array2.c:8
8      printf(str_a);    
EN

回答 2

Stack Overflow用户

发布于 2013-01-23 06:24:58

您没有说您是如何构建程序的,但我猜您启用了编译器优化。

当编译器优化你的代码时,它允许以任何它喜欢的方式重新排序你的代码,前提是不可能通过观察正在运行的程序来区分(即,它在逻辑上保持等价)。当然,如果您附加一个调试器并停止程序,您可以看到重新排序,这就是为什么调试未优化的代码很常见的原因。

编译器不仅可以重新排序代码行,还可以重新排序每行中的所有单独操作。断点通常是在与给定行关联的第一条指令上设置的,但是如果您单步执行一个函数,您通常会看到程序明显多次跳回到每一行,然后您可以看到这些行是如何交错的。

当然,当编译器通过删除重复的操作来优化代码时,并不总是清楚给定的指令与哪一行源代码相关,然后您可能会出现一些非常违反直觉的行为。

最后,编译器可以自由地完全删除任何不使用的代码,或者可以与其他代码组合在一起,因此它可能看起来根本不会命中代码行。

票数 0
EN

Stack Overflow用户

发布于 2013-01-23 15:47:33

Line number 10 out of range; char_array2.c has 9 lines高度怀疑。我认为,您的GDB无法确定行尾。在源文件中将\n转换为\r\n,并将编辑器设置为使用\r\n

另外,我同意ams的观点,完全肯定地说,使用显式的-g -O0选项进行编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14468557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档