在我的机器上发出命令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寄存器。)
基于所有这些,我认为:
信息寄存器
未显示寄存器,这是否意味着该寄存器在计算机上不存在,或者可能存在,但未在调试程序的上下文中使用?(根据GDB文档,我认为是前者。)我正在努力做这个练习,它的要点是:
Stack4研究了覆盖保存的EIP和标准缓冲区溢出。
因此,主要问题是:在这种情况下,我应该选择rip而不是eip吗?(然而,除了回答这一点,我想更好地了解一般背景,因此以上,更详细的问题。)
我想,您运行的是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