`
fanrey
  • 浏览: 256566 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用gdb获得寄存器的值

    博客分类:
  • gdb
 
阅读更多
//gdb_debug.c
#include <stdio.h>
f1()
{
	register int i = 12345;
	printf("%d\n", i);
	double x = -5.5625;
	printf("%d\n",x);
}
main()
{
	f1();
}


gcc -g -o gdb_debug gdb_debug.c

用gdb调试:
ubuntu@ubuntu-VirtualBox:~$ gdb gdb_debug
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/ubuntu/gdb_debug...done.
(gdb) b main
Breakpoint 1 at 0x804840a: file gdb_debug.c, line 11.
(gdb) r
Starting program: /home/ubuntu/gdb_debug

Breakpoint 1, main () at gdb_debug.c:11
11 f1();
(gdb) list
6 double x = -5.5625;
7 printf("%d\n",x);
8 }
9 main()
10 {
11 f1();
12 }
(gdb) x/i $pc
=> 0x804840a <main+6>: call   0x80483c4 <f1>
(gdb) si
f1 () at gdb_debug.c:3
3 {
(gdb) si
0x080483c5 3 {
(gdb) si
0x080483c7 3 {
(gdb) disass main
Dump of assembler code for function main:
   0x08048404 <+0>: push   %ebp
   0x08048405 <+1>: mov    %esp,%ebp
   0x08048407 <+3>: and    $0xfffffff0,%esp
   0x0804840a <+6>: call   0x80483c4 <f1>
   0x0804840f <+11>: mov    %ebp,%esp
   0x08048411 <+13>: pop    %ebp
   0x08048412 <+14>: ret   
End of assembler dump.
(gdb) disass f1
Dump of assembler code for function f1:
   0x080483c4 <+0>: push   %ebp
   0x080483c5 <+1>: mov    %esp,%ebp
=> 0x080483c7 <+3>: push   %ebx
   0x080483c8 <+4>: sub    $0x24,%esp
   0x080483cb <+7>: mov    $0x3039,%ebx
   0x080483d0 <+12>: mov    $0x80484e0,%eax
   0x080483d5 <+17>: mov    %ebx,0x4(%esp)
   0x080483d9 <+21>: mov    %eax,(%esp)
   0x080483dc <+24>: call   0x80482f4 <printf@plt>
   0x080483e1 <+29>: fldl   0x80484e8
   0x080483e7 <+35>: fstpl  -0x10(%ebp)
   0x080483ea <+38>: mov    $0x80484e0,%eax
   0x080483ef <+43>: fldl   -0x10(%ebp)
   0x080483f2 <+46>: fstpl  0x4(%esp)
   0x080483f6 <+50>: mov    %eax,(%esp)
   0x080483f9 <+53>: call   0x80482f4 <printf@plt>
   0x080483fe <+58>: add    $0x24,%esp
   0x08048401 <+61>: pop    %ebx
   0x08048402 <+62>: pop    %ebp
   0x08048403 <+63>: ret   
---Type <return> to continue, or q <return> to quit---
End of assembler dump.
(gdb)

IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的。
EIP是32位机的指令寄存器。

IP:instruction pointer
PC: progtam counter 
两者都是一个寄存器,指向当前执行指令的下一条指令。


(gdb) info all-registers  //显示所有寄存器的内容
eip            0x80483c5 0x80483c5 <f1+1>

(gdb) disass f1   //反汇编函数f1
Dump of assembler code for function f1:
   0x080483c4 <+0>: push   %ebp
=> 0x080483c5 <+1>: mov    %esp,%ebp
   0x080483c7 <+3>: push   %ebx

EBP: 栈底指针
ESP: 栈顶指针

通用寄存器:
(gdb) info all-registers
eax            0xbffff1d4 -1073745452
ecx            0xf877f12f -126357201
edx            0x1 1
ebx            0x3039 12345  //寄存器变量存在此
st0~7是80位的浮点数寄存器,用于存放浮点数:
st0            0 (raw 0x00000000000000000000)
st1            0 (raw 0x00000000000000000000)
st2            0 (raw 0x00000000000000000000)
st3            0 (raw 0x00000000000000000000)
st4            0 (raw 0x00000000000000000000)
---Type <return> to continue, or q <return> to quit---
st5            0 (raw 0x00000000000000000000)
st6            0 (raw 0x00000000000000000000)
st7            -5.5625 (raw 0xc001b200000000000000)


用GDB查看core file;
gdb <binary file> <core file>
然后输入where即可看到core里的堆栈信息。
分享到:
评论

相关推荐

    gdb调试官方文档

    GDB提供了许多调试程序所需的功能,如设置断点、单步执行、观察变量和寄存器值等。GDB官方文档通常会介绍其使用的命令、调试会话的流程、程序运行控制、数据观察和修改、以及多线程和多进程程序的调试方法。 在官方...

    OpenOCD和GDB简介与使用1

    例如,GDB提供了`info registers`命令查看当前CPU寄存器的值,`bt`命令用于打印调用堆栈,`thread`命令切换线程,`print`命令查看变量的值,而`mdw`命令则用于读取指定地址范围的内存数据。这些功能极大地提升了调试...

    gdb 快速入门中文教程

    - **程序状态监控**:可以在程序暂停时查看变量值、内存内容、寄存器状态等。 - **错误定位**:通过设置断点、观察点等方式定位程序中的错误。 - **代码修改**:直接在调试过程中修改程序代码,观察修改效果。 #...

    GDB 调试手册 Debugging with GDB 最新

    3. **检查程序状态**:当程序因断点或异常而暂停时,GDB允许用户查看变量值、内存内容、寄存器状态等,以理解程序的执行情况。 4. **修改程序状态**:用户可以在程序暂停时修改变量值或内存内容,从而测试不同的执行...

    gdb internal

    寄存器卸载是指GDB如何从CPU寄存器中获取和存储信息的过程。 #### 八、符号处理 符号处理是GDB另一项重要的功能,它涉及到符号表的读取、解析以及类型的处理等。 ##### 8.1 符号读取 符号读取是指GDB如何从程序...

    UNIX gdb调试工具指南

    当程序异常终止时,操作系统可能会生成一个核心转储文件,记录了程序崩溃时的内存状态和寄存器值。加载核心转储文件后,GDB可以帮助分析导致程序崩溃的原因,比如内存溢出、除以零错误等。使用时,需先确保系统已...

    linux 调试器GDB介绍

    5. **修改程序状态**:GDB还允许修改内存和寄存器的值,这对于模拟特定条件或修复某些问题非常有用。 6. **继续执行**:当完成某个区域的检查后,可以选择继续执行直到下一个断点或程序结束。 #### GDB命令详解 - ...

    arm-linux-gdb-7.5.tar.gz

    接着,我们可以加载目标程序,设置断点,单步执行,查看变量值,甚至在运行时修改内存和寄存器状态。 此外,`arm-linux-gdb-7.5`还支持GDB Server模式,让调试器与目标设备分离,可以实现多用户同时调试,这对于...

    gdb使用技巧

    - 使用`info registers`或简写`info r`命令可以查看寄存器的当前值。 #### 十二、改变程序的执行 1. **跳转到指定位置执行** - 使用`jump address`命令可以让程序跳转到指定地址继续执行。 2. **修改被调试程序...

    gdb程序调试详细介绍

    使用gdb调试程序时,只需在命令行中输入`gdb &lt;executable&gt;`即可启动gdb并加载指定的可执行文件。例如: ``` gdb main ``` 启动后,gdb会显示其版本信息和许可声明,接着进入命令行交互模式。 3. **查看命令...

    gdb 调试gdb 调试gdb 调试gdb 调试gdb 调试

    本文全面介绍了gdb的使用方法和技巧,包括基本信息操作、函数管理、断点管理、打印与显示、多进程/线程调试、核心转储与程序状态、汇编级调试、程序状态修改、信号处理、共享库管理、脚本配置、命令行选项、预处理器...

    Linux基本反汇编结构与GDB入门.doc

    在GDB中,可以使用`gdb exchange`启动调试,通过`run`命令运行程序,`break`命令设置断点,`step`命令单步执行,`print`命令打印变量值,`continue`命令继续执行直到遇到下一个断点等。这些基础操作对于理解程序行为...

    gdb用法详细介绍

    #### 五、使用gdb调试core文件的步骤 1. **启动gdb并加载core文件**: ```bash gdb ./your_program /path/to/core_file ``` 其中`./your_program`是你想要调试的程序路径,`/path/to/core_file`则是core文件的...

    GDB调试程序 unix下程序员的得力助手

    4. **环境修改**:动态更改程序的执行环境,例如修改寄存器或内存值,从而测试不同的程序路径。 #### GDB的特点与优势 - **灵活性高**:命令行界面赋予了GDB极高的灵活性,开发者可以根据自己的需求构建复杂的调试...

    gdb用户手册(英文原版)

    5. **修改内存和寄存器**:`gdb`提供了修改内存或寄存器内容的能力,这对于某些特定类型的错误调试非常有用。 6. **查看堆栈信息**:可以通过查看函数调用栈来追踪程序的执行路径。 7. **条件断点**:可以根据特定...

    GDB调试说明

    在另一个终端中输入`tty`命令可以获得当前终端的ID,然后在GDB命令中使用`tty`加上终端ID即可完成重定向。 2. 窗口切换及刷新 在TUI模式下,可以使用`layout`命令来切换不同的显示区域,比如源代码、汇编和CPU...

    湖南大学-计算机组成原理实验-实验3-bomblab.pdf

    该函数的作用是进行循环操作,并且使用到了esi和ebx寄存器的值。因此,我们可以通过分析汇编代码,找到该函数的成功跳转条件,以此为突破口寻找应该在命令行输入何种字符通关。 实验环境 实验环境为ubuntu14.04...

    山东大学计算机系统基础实验三 Defusing Binary-Bomb

    每个阶段都要求学生更加深入地分析内存和寄存器的值。在后续阶段中,学生可能需要对函数的调用关系和参数传递机制有更深入的认识,有时甚至需要考虑程序的状态变化和异常处理。 实验的挑战不仅在于掌握GDB的使用,...

    vcs仿真简介-三种调试模式

    - `+cli+[&lt;module_name&gt;=]2`: 在1的基础上增加了在网络和寄存器值变化时设置断点的功能。 - `+cli+[&lt;module_name&gt;=]3`: 在2的基础上增加了在网络上的强制赋值功能。 - `+cli+[&lt;module_name&gt;=]4`: 在3的基础上增加了...

    Coredump简介及使用

    利用调试工具,开发者可以从Coredump文件中获取到程序崩溃时的内存快照、寄存器值、运行堆栈等信息,然后通过源代码和调试信息逐步定位问题所在。 五、开始使用Coredump 一旦Coredump文件生成,并且准备工作就绪,...

Global site tag (gtag.js) - Google Analytics