[英]gdb is setting a breakpoint at an unexpected line
1 #include <stdio.h>
2 int main()
3 {
4 int i;
5 for (i=0; i<=10; i++)
6 {
7 puts("Hello world\n");
8 }
9 return 0;
10 //test
}
我正在尝试使用 gdb 调试上面的代码。我面临的问题是,当我使用命令break main
时,它在第 5 行设置断点,而不是在第 2 行设置断点。 下面是我得到的 output:
(gdb) break main
Breakpoint 1 at 0x555555555141: file firstprogram.c, line 5.
我原以为断点会设置在第 2 行而不是第 5 行。
您只能在有指令的地址处设置断点。
看看你的编译器是如何把这个 C function 变成 asm. (例如,在使用当前 GCC/clang 的Godbolt目标 Linux 上。)
在 GCC 或 clang output 中,有或没有优化,都有针对 function 序言的说明(分别压入调用保留寄存器或使用帧指针制作堆栈帧)。 GCC 和 clang 生成的调试信息将这些指令与开头{
相关联,第 3 行。
(Godbolt 编译器资源管理器的颜色语法突出显示和鼠标悬停突出显示基于编译器生成的调试信息,在将源代码行映射到/从地址时使用相同的信息 GDB。)
function 主体中任何内容的第一条指令要么是未优化版本中的i=0
,要么是循环主体中的mov edi, OFFSET FLAT:.LC0
/ call puts
。
(GCC/clang 认为mov ebx, 11
loop counter init 与源代码行无关,因为在优化之后他们已经将循环转换为 11 次迭代的递减计数到零。那个 mov-to-register 指令是function 序言,根据调试信息。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.