我遇到了一个问题,即在添加断点时,gdb将行号映射到错误的内存地址。
/* hello.s */ .section .data str: .ascii "hello\n" strlen = . - str .section .text print: pushl %ebp movl %esp, %ebp pushl %ebx movl $4, %eax movl $1, %ebx movl $str, %ecx movl $strlen, %edx int $0x80 popl %ebx movl %ebp, %esp popl %ebp ret .globl _start _start: call print movl $1, %eax movl $0, %ebx int $0x80
我用debugging信息编译它,然后链接。
$ as -g --32 -o hello.o hello.s $ ld -m elf_i386 -o hello hello.o
接下来,在gdb中,我尝试在第11行(打印函数的第一行( pushl %ebp
))上设置一个断点。
$ gdb ./hello (gdb) break hello.s:11
断点3在0x8048078:文件hello.s,第11行。
如输出所示,断点设置在地址0x8048078处。 但是,这是错误的地址。 当我在gdb中运行我的程序时,它在第14行中断。第11行的地址是0x8048074,使用gdb的info命令确认。
(gdb) info line hello.s:11
“hello.s”的第11行起始于地址0x8048074,结束于0x8048075。
在打印指令上设置断点直接工作(断点设置为第11行的地址0x8048074)。
怎么当我添加第11行的断点,gdb不使用相同的地址作为输出使用上面的信息命令? 这是我试图打破的内存地址。
我在gdb 7.11.1和8.0.1上遇到同样的问题。 我曾尝试添加.type print,@function
注释,但是这并没有解决我的问题。
怎么来的
默认情况下,当你在一个函数或函数启动的一行上设置断点时,GDB会尝试跳过函数prolog。
这往往是C
开发人员想要的,因为他们通常对参数设置不感兴趣。
如果你想要其他的东西,可以使用b *address
或者b &print
来防止GDB执行正常的操作。