当前位置: 首页 > 知识库问答 >
问题:

gdb“信息框架”中没有epb/eip寄存器

戚良弼
2023-03-14

在我的机器上发出命令info frame时(断点在main上),输出如下:

(gdb) info frame
Stack level 0, frame at 0x7fffffffdbd0:
 rip = 0x4005b1 in main; saved rip = 0x7ffff7a53b05
 Arglist at 0x7fffffffdbc0, args: 
 Locals at 0x7fffffffdbc0, Previous frame's sp is 0x7fffffffdbd0
 Saved registers:
  rbp at 0x7fffffffdbc0, rip at 0x7fffffffdbc8

根据我对此答案的理解,< code>eip和< code>ebp寄存器(不在我的输出中)具有以下含义:

eip是下一条要执行的html" target="_blank">指令的寄存器(也称为程序计数器)

“ebp”是寄存器,通常被认为是这个堆栈帧的局部地址的起始地址,它使用“偏移量”来寻址

从另一个答案中,我明白了

[RIP是]指令指针

[...]

其中一些寄存器被设想用于特定用途,并且通常都是。最关键的是RSP和RBP。

最后,信息寄存器为我提供了以下输出:

(gdb) info registers
rax            0x4005ad 4195757
rbx            0x0      0
rcx            0x0      0
rdx            0x7fffffffdcc0   140737488346304
rsi            0x7fffffffdca8   140737488346280
rdi            0x2      2
rbp            0x7fffffffdbc0   0x7fffffffdbc0
rsp            0x7fffffffdbc0   0x7fffffffdbc0
r8             0x7ffff7dd7c60   140737351875680
r9             0x7ffff7dead10   140737351953680
r10            0x7fffffffda50   140737488345680
r11            0x7ffff7a53a10   140737348188688
r12            0x4004b0 4195504
r13            0x7fffffffdca0   140737488346272
r14            0x0      0
r15            0x0      0
rip            0x4005b1 0x4005b1 <main+4>
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0

(注意:也尝试使用< code>info all-registers。更长的输出,仍然没有EIP/EPB——这是我所期望的,因为根据文档,这些是vector/FPU寄存器。)

基于所有这些,我认为:

  • 在我的机器上没有 epb/eip 寄存器
  • 而不是eip,撕裂总是在我的机器上使用
  • 而不是ebp,rbp总是在我的机器上使用
  1. 上述理解正确吗?(理论B:我的机器上也有这些寄存器,但gcc编译程序的方式是,它使用rip而不是eip,使用rbp而不是ebp。理论C:由于我在函数开始时中断,而不是在函数内部中断,因此eip和ebp尚未使用;在这种情况下,rip和rbp还有其他用途。)
  2. (假设我的主要理论是正确的):是新机器有eip/ebp而不是rbp/rip,还是新机器有两组寄存器,而旧机器只有rbp/rip
  3. 如果gdb中的信息寄存器未显示寄存器,这是否意味着该寄存器在计算机上不存在,或者可能存在,但未在调试程序的上下文中使用?(根据GDB文档,我认为是前者。)

我正在努力做这个练习,它的要点是:

Stack4研究了覆盖保存的EIP和标准缓冲区溢出。

因此,主要问题是:在这种情况下,我应该选择rip而不是eip吗?(然而,除了回答这一点,我想更好地了解一般背景,因此以上,更详细的问题。)

共有1个答案

方梓
2023-03-14

我想,您运行的是x86-64,即64位x86变体。对于该版本的架构,这些寄存器扩展至64位,并具有新名称< code>%rbp和< code>%rip。

 类似资料:
  • 通用信息系统框架诞生的目的,是帮助企业开发信息系统之初快速搭建起系统基本框架,可以节省精力财力和时间,加快开发进度。 通用信息系统框架包括服务端和客户端两个部分,其中服务端部分完成了整合Spring+Struts2+mybatis技术,客户端包括系统登录,系统主页(其中有菜单展现、多种功能导航、登录用户信息修改等),多种功能导航实现了菜单树、Tab栏、对象树等,以后可以继续丰富,还有通用的权限管理

  • 使用gdb时,如果想查看gdb版本信息,可以使用“show version”命令: (gdb) show version GNU gdb (GDB) 7.7.1 Copyright (C) 2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/g

  • 问题内容: 我正在尝试从Linux amd64上的gdb中调查C / C ++堆的状态,有没有很好的方法呢? 我尝试过的一种方法是“调用mallinfo()”,但是不幸的是,由于gdb无法正确处理返回值,因此我无法提取所需的值。 我不容易为嵌入的进程编写要编译为二进制文件的函数,因此我可以通过以自己的代码调用mallinfo()来简单地实现自己的函数以提取值。也许有一个巧妙的技巧可以让我即时进行此

  • 为什么数据段寄存器(ds/es/fs/gs)在GDB中总是显示为0x0?例如,无论我看哪个进程或线程,“info reg”似乎总是给我这样的输出: 我正在尝试调试glibc代码,在我正在分解的函数中看到fs段前缀: 我知道这就是glibc将如何引用线程的TCB(tcbhead_t)来获取TLS和其他重要内容。所以这不是意味着每个线程都需要一个唯一的描述符条目吗?每个线程不应该对fs寄存器有一个唯一

  • 使用gdb时,如果想查看gdb版权相关信息,可以使用“show copying”命令: (gdb) show copying GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc.

  • 在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户。 对于这个功能,Django 提供基于Cookie 和会话的消息,无论是匿名用户还是认证的用户。其消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定level 标签,表示其优先级(例如info、warning