首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GDB断点设置在x86程序集函数的错误地址上?

为什么GDB断点设置在x86程序集函数的错误地址上?
EN

Stack Overflow用户
提问于 2017-10-22 20:19:37
回答 1查看 1.7K关注 0票数 2

我遇到了一个问题,gdb在添加断点时将行号映射到错误的内存地址。

下面的x86 Linux程序会打印"hello“。

代码语言:javascript
复制
/* 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

我用调试信息编译它,然后链接。

代码语言:javascript
复制
$ as -g --32 -o hello.o hello.s
$ ld -m elf_i386 -o hello hello.o

接下来,在gdb中,我尝试在第11行(打印函数(pushl %ebp)的第一行)上设置一个断点。

代码语言:javascript
复制
$ gdb ./hello
(gdb) break hello.s:11

断点3位于0x8048078:文件hello.s,第11行。

如输出所示,断点设置在地址0x8048078。不过,那是错误的地址。当我在gdb中运行我的程序时,它会在第14行中断。第11行的地址是0x8048074,使用gdb的info命令确认。

代码语言:javascript
复制
(gdb) info line hello.s:11

"hello.s“的第11行从地址0x8048074开始,以0x8048075结束。

在打印指令上设置断点可以直接工作(为第11行0x8048074的地址设置断点)。

为什么当我为第11行添加一个断点时,gdb使用上面的info命令不使用与输出相同的地址?这是我想要破解的内存地址。

我在gdb 7.11.1和8.0.1上都有同样的行为。我尝试过添加一个.type print,@function注释,但这并没有解决我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-22 23:36:35

怎么会这样

默认情况下,当您在函数上设置断点或函数启动的行时,GDB尝试跳过过去的函数prolog。

这往往是C开发人员想要的,因为他们通常对参数设置不感兴趣。

如果您需要其他的东西,请使用b *addressb &print来阻止GDB做它通常的事情。

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

https://stackoverflow.com/questions/46878778

复制
相关文章

相似问题

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