gdb 详解
环境:gcc (OpenWrt/Linaro GCC 4.8)
以如下的简单代码为例,说明gdb的使用。
void func1(int a, int b)
{
int c;
c = a + b;
} int main(void)
{ func1(,);
return ;
}
1. gdb 下一步的命令
a.执行下一行语句(语句级别)
next(或n) 执行下一行语句,如果是函数调用则直接将函数执行完;相当于visual studio调试器中的"Step Over (单步跟踪)"
step(或s) 执行下一行语句,如果是函数调用则进入函数中。即常说的单步调试,相当于visual studio调试器中的"Step Into (单步跟踪进入)"
这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)
b.执行下一条指令(指令级)
si 类似于s;
ni 类似于n;
这两个命令(si/ni)所针对的是汇编指令
2. disassemble
可以反汇编当前函数或者指定的函数,
单独用disassemble命令是反汇编当前函数,
如果disassemble命令后面跟函数名或地址,则反汇编指定的函数.
(gdb) disassemble
Dump of assembler code for function main:
0x00008440 <+>: push {r11, lr}
0x00008444 <+>: add r11, sp, #
=> 0x00008448 <+>: mov r0, #
0x0000844c <+>: mov r1, #
0x00008450 <+>: bl 0x8410 <func1>
0x00008454 <+>: mov r3, # ; 0x64
0x00008458 <+>: mov r0, r3
0x0000845c <+>: pop {r11, pc}
End of assembler dump. (gdb) disassemble
Dump of assembler code for function func1:
0x00008410 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008414 <+>: add r11, sp, #
0x00008418 <+>: sub sp, sp, #
0x0000841c <+>: str r0, [r11, #-]
0x00008420 <+>: str r1, [r11, #-]
=> 0x00008424 <+>: ldr r2, [r11, #-]
0x00008428 <+>: ldr r3, [r11, #-]
0x0000842c <+>: add r3, r2, r3
0x00008430 <+>: str r3, [r11, #-]
0x00008434 <+>: sub sp, r11, #
0x00008438 <+>: pop {r11} ; (ldr r11, [sp], #)
0x0000843c <+>: bx lr
End of assembler dump.
3. 显示寄存器的信息
info registers可以显示所有寄存器的当前值(不包括浮点寄存器)
info all-registers(包括浮点寄存器)
简写: i r
(gdb) info registers
r0 0xb
r1 0x16
r2 0xbefffe2c
r3 0x8440
r4 0xbeffff14
r5 0x8304
r6 0xbefffc80
r7 0x8
r8 0x0
r9 0x0
r10 0xb6ffef7c
r11 0xbefffc64
r12 0xbefffd68
sp 0xbefffc50 0xbefffc50
lr 0x8454
pc 0x8424 0x8424 <func1+>
cpsr 0x60000010
(gdb) i r
r0 0xb
r1 0x16
r2 0xbefffe2c
r3 0x8440
r4 0xbeffff14
r5 0x8304
r6 0xbefffc80
r7 0x8
r8 0x0
r9 0x0
r10 0xb6ffef7c
r11 0xbefffc64
r12 0xbefffd68
sp 0xbefffc50 0xbefffc50
lr 0x8454
pc 0x8424 0x8424 <func1+>
cpsr 0x60000010
4.查看内存的值:
gdb中使用"x"命令来打印内存的值,格式为"x/nfu addr"。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:
a)n:输出单元的个数。
b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。
x(hex) 按十六进制格式显示变量。
d(decimal) 按十进制格式显示变量。
u(unsigned decimal) 按十进制格式显示无符号整型。
o(octal) 按八进制格式显示变量。
t(binary) 按二进制格式显示变量。
a(address) 按十六进制格式显示变量。
c(char) 按字符格式显示变量。
f(float) 按浮点数格式显示变量
c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)
举例:
以16进制格式打印从add开始的16个byte的值:
(gdb) x/16xb $r11
0xbefffc64: 0x6c 0xfc 0xff 0xbe 0x00 0x00 0x00 0x00
0xbefffc6c: 0xc4 0xcc 0xfc 0xb6 0x00 0x90 0xfd 0xb6
5.打印栈帧信息:
frame 打印当前栈帧的简要信息。
(gdb) frame
# func1 (a=, b=) at hello.c:
in hello.c
6.info frame 打印当前栈帧的详细信息。
(gdb) info frame
Stack level , frame at 0xbefffc68:
pc = 0x8434 in func1 (hello.c:); saved pc 0x8454
called by frame at 0xbefffc70
source language c.
Arglist at 0xbefffc64, args: a=, b=
Locals at 0xbefffc64, Previous frame's sp is 0xbefffc68
Saved registers:
r11 at 0xbefffc64
7.info frame args 打印指定栈帧的详细信息
(gdb) i f
Stack frame at 0xbefffc70:
pc = 0x8454 in main (hello.c:); saved pc 0xb6fcccc4
caller of frame at 0xbefffc68
source language c.
Arglist at 0xbefffc6c, args:
Locals at 0xbefffc6c, Previous frame's sp is 0xbefffc70
Saved registers:
r11 at 0xbefffc68, lr at 0xbefffc6c
8.info args 打印函数参数信息
(gdb) info args
a =
b =
9.info locals 打印当前可访问的局部变量的信息。
(gdb) info locals
c =
10.怎样知道一个栈帧的大小?
fp和sp之间的区域就是一个函数的栈帧的大小。
fp一般是指r11寄存器。
sp一般是指r13寄存器。
(gdb) i r
r0 0xb
r1 0x16
r2 0xb
r3 0x8440
r4 0xbeffff14
r5 0x8304
r6 0xbefffc80
r7 0x8
r8 0x0
r9 0x0
r10 0xb6ffef7c
r11 0xbefffc64
r12 0xbefffd68
sp 0xbefffc50 0xbefffc50
lr 0x8454
pc 0x8428 0x8428 <func1+>
cpsr 0x60000010 (gdb) disassemble
Dump of assembler code for function func1:
0x00008410 <+>: push {r11} ; (str r11, [sp, #-]!)
=> 0x00008414 <+>: add r11, sp, # ;将sp中的内存地址放入r11,即设置fp
0x00008418 <+>: sub sp, sp, # ;将sp中的内存地址减小20,即设置func1的栈顶指针,如上两条指令执行完后,该函数的栈帧的大小就确定了, bytes
0x0000841c <+>: str r0, [r11, #-] ;函数参数赋值,将r0中的值存入[r11, #-]内存地址,即函数实参入栈
0x00008420 <+>: str r1, [r11, #-] ;函数参数赋值,将r1中的值存入[r11, #-]内存地址
0x00008424 <+>: ldr r2, [r11, #-]
0x00008428 <+>: ldr r3, [r11, #-]
0x0000842c <+>: add r3, r2, r3
0x00008430 <+>: str r3, [r11, #-]
0x00008434 <+>: sub sp, r11, #
0x00008438 <+>: pop {r11} ; (ldr r11, [sp], #)
0x0000843c <+>: bx lr
End of assembler dump.
有时在调试过程中,想记录下来操作的过程及相关信息,那么 执行set logging on即可打卡记录,默认存在gdb.txt。
当然也可以自己指定log文件,set logging file logname
set logging overwrite on
命令可以让输出覆盖之前的日志文件;而 “set logging redirect on
”命令会让gdb的日志不会打印在终端
gdb 详解的更多相关文章
- GDB详解
1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...
- 调试工具GDB详解
1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...
- GDB scheduler-locking 命令详解
GDB scheduler-locking 命令详解 GDB> show scheduler-locking //显示线程的scheduler-locking状态GDB> set ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
- Linux /dev目录详解和Linux系统各个目录的作用
Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...
- linux 中/proc 详解
proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告 ...
- Linux 之 编译器 gcc/g++参数详解
2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...
- Linux中/proc目录下文件详解
转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...
- netstat命令详解
它主要的用法和详解! (netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态. netstat -nat |awk ‘{print $}’|s ...
随机推荐
- 【树状数组】bzoj2743 [HEOI2012]采花
http://www.cnblogs.com/proverbs/archive/2012/10/29/2745281.html (↑)这样处理之后,每次询问时,对于每种颜色,从1到其倒数第二次出现的位 ...
- [Markdown]纯文本标记语言MarkdowPad2--MD语法知识
##1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // 错误代码 ######## h8 // ...
- 通过UIImagePickerController选取的图片名称信息
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDic ...
- JAVA常见算法题(二十六)
package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...
- DELPHI黑客编程(一):正向后门原理实现
前言 在渗透测试中经常用到远控.后门等辅助后渗透权限维持工具,有一款好用的自制后门可以在巩固渗透成果方面有很大的帮助.今天给大家简单讲解下后门的原理和实现的方法,主要针对技术研究和原理演示,请各位看官 ...
- Linux的PCI驱动分析
1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置 ...
- android: android中dip、dp、px、sp和屏幕密度
android中dip.dp.px.sp和屏幕密度 转自:http://www.cnblogs.com/fbsk/archive/2011/10/17/2215539.html 1. dip: dev ...
- 【Android】The application has stopped unexpectedly.Please try again.
打出的android APK在android4.0.2手机上运行正常,但是在2.3.7的MOTO DEFY ME525上运行失败. android 2.3.3版本的模拟器上面运行失败: Sorry! ...
- @Autowired与@Resource的使用方法和差别
一.@Autowired: 1.Spring 2.5 引入了 @Autowired 凝视,它能够对类成员变量.方法及构造函数进行标注,完毕自己主动装配的工作. 通过 @Autowired的使用来消除 ...
- 小程序image的13种mode
注:image组件默认宽度300px.高度225px mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式. 缩放: 裁剪: 文章来 ...