gdb汇编调试tips

1、内存查看命令x.

x/x 以十六进制输出

x/d 以十进制输出

x/c 以单字符输出

x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)

x/s 以字符串输出

(gdb) x/10i main
   0x80483bb <main>:    push   %ebp
   0x80483bc <main+1>:    mov    %esp,%ebp
   0x80483be <main+3>:    and    $0xfffffff0,%esp
   0x80483c1 <main+6>:    sub    $0x20,%esp
   0x80483c4 <main+9>:    movl   $0x0,0x1c(%esp)
   0x80483cc <main+17>:    movl   $0x5,(%esp)
=> 0x80483d3 <main+24>:    call   0x8048394 <fact>
   0x80483d8 <main+29>:    mov    %eax,0x1c(%esp)
   0x80483dc <main+33>:    mov    0x1c(%esp),%eax
   0x80483e0 <main+37>:    leave  

2、内存断点break

break *addr 表示在地址addr处打断点.

(gdb) disassemble main
Dump of assembler code for function main:
   0x080483bb <+0>:    push   %ebp
   0x080483bc <+1>:    mov    %esp,%ebp
   0x080483be <+3>:    and    $0xfffffff0,%esp
   0x080483c1 <+6>:    sub    $0x20,%esp
   0x080483c4 <+9>:    movl   $0x0,0x1c(%esp)
   0x080483cc <+17>:    movl   $0x5,(%esp)
   0x080483d3 <+24>:    call   0x8048394 <fact>
   0x080483d8 <+29>:    mov    %eax,0x1c(%esp)
   0x080483dc <+33>:    mov    0x1c(%esp),%eax
   0x080483e0 <+37>:    leave
   0x080483e1 <+38>:    ret
End of assembler dump.
(gdb) b *0x080483d3
Breakpoint 1 at 0x80483d3: file test.c, line 14.
(gdb) run
Starting program: /mnt/hgfs/Share/csapp/a.out 

Breakpoint 1, 0x080483d3 in main () at test.c:14
14        c = fact(5);

3、打印寄存器

可以使用 info registers查看所有寄存器:

(gdb) info registers
eax            0xbffff6c4    -1073744188
ecx            0x6400d69f    1677776543
edx            0x1    1
ebx            0x288ff4    2658292
esp            0xbffff5f0    0xbffff5f0
ebp            0xbffff618    0xbffff618
esi            0x0    0
edi            0x0    0
eip            0x80483c4    0x80483c4 <main+9>
eflags         0x286    [ PF SF IF ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

或者使用 p/x $ebp打印ebp寄存器的值

(gdb) p/x $ebp
$2 = 0xbffff618

4、设置观察点

当我们需要关注每次执行后ebp的值,可以用display设置观察点

(gdb) display $ebp
1: $ebp = (void *) 0xbffff618
(gdb) si
14        c = fact(5);
1: $ebp = (void *) 0xbffff618
(gdb) si
0x080483d3    14        c = fact(5);
1: $ebp = (void *) 0xbffff618
时间: 2024-08-10 21:29:24

gdb汇编调试tips的相关文章

GDB堆栈跟踪与汇编调试

GDB堆栈跟踪与汇编调试 分析过程 ?使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编 出现错误:fatal error 这时需要下载安装库文件 命令:sudo apt-get install libc6-dev-i386 之后再进行一次操作就可以产生汇编了 ?使用gdb gdb1指令打开gdb调试器 ?使用break main指令在main函数处设置断点,并记得先用r指令运行代码,可以看到运行时在main函数位置停了下来,否则会出现如图的

Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>的童鞋应该是a piece of

使用 GNU GCC 和 GDB 开发调试应用程序

gcc 命令的使用 在使用GCC编译程序时,编译过程可以被细分为四个阶段: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 如果不加任何参数, gcc 默认执行所有的操作,直接生成可执行文件. 以上四个阶段对应参数为: 1.        -E  只执行预处理 2.        –S  只编译,不汇编和链接 3.        –c  编译汇编不链接 4.        –o  链接成目标文件 GCC常用选项 -c 通知

opensips/kamailio gdb代码调试方法详解

 要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读.业务处理.数据发送等事情,然后再次等待此socket事件.当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进

ubuntu下gdb代码调试

1.什么是GDB? GDB全称是GNU Project Debugger,当程序执行时,让你可以进入到另一个程序的内部查看,或者当一个程序崩溃的时候它在做什么. GDB可以帮助你做如下四种主要的方面,来帮助你捕捉到bug: 1.启动你的程序,指定可能影响你行为的事情(设定初始的一些变量) 2.在特殊的条件的时候暂停你的程序执行(在端点的时候可以暂停,或者说是条件的暂停) 3.当程序暂停的时候,可以查看这个时候发生了什么(查询堆栈,变量) 4.通过改变程序中的参数,你可以通过实验得出某一个bug所

GDB代码调试与使用

GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接回车表示,重复上一次命令 设置断点,在源程序16行处:break 16 设置断点,在函数func()入口处:break func 查看断点信息:info break 运行程序:run 在断点处停住 单条语句执行:next 继续运行程序:continue[程序输出:result[1-100]=5050

gdb 多线程调试

gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html http://blogold.chinaunix.net/u3/94700/showart_2389432.html   <推荐阅读> 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调

GDB 多进程调试

启动: $gdb <file>  || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb)list  简写为 (gdb)l 技巧(gdb)list 1,20   //查看1到20行的代码   使用断点: 建立断点 (gdb)break  //可以简写为(gdb)b (gdb)b <function>   || <file>:<function>  //这种是为还

gdb 远程调试android进程 -转

什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停住.(断点可以是表达式) 程序被停住后,可以查看此时程序中发生的事. 动态改变程序的执行环境. GDB远程调试原理图 如图上所示,我们需要使用gdbserver依附到我们要调试的进程上,gdb通过adbd和手机上的gdbserver 进行socket通信. 远程调试实战 在手机上启动gdbserve