工具篇_GDB

主要作用

一般来说,GDB主要帮助你完成下面四个方面的功能:

  • 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  • 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  • 3、当程序被停住时,可以检查此时你的程序中所发生的事。
  • 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

gdb操作

注:gdb命令操作中是允许简写的,例如run,用r代替。

查看帮助

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

执行程序

要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<;和>;)和shell通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。

(gdb) file [a.out] //加载被调试的可执行程序文件。
(gdb)set args –b –x
(gdb) show args
(gdb)r //执行程序
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数

补充

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r。

(gdb)start:单步执行,运行程序,停在第一执行语句。

单步运行

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n。

(gdb) nexti :单步一条机器指令,不进入函数。

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s。

(gdb)stepi: 单步一条机器指令。

(gdb)continue:继续运行,简写c。

设置断点

break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:

  • 1,break line-number 使程序恰好在执行给定行之前停止。
  • 2,break function-name 使程序恰好在进入指定的函数之前停止。
  • 3,break line-or-function if condition如果condition(条件)是真,程序到达指定行或函数时停止。(设置条件断点)
  • 4,break routine-name 在指定例程的入口处设置断点

如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
(gdb) break filename:line-number
(gdb) break filename:function-name


要想设置一个条件断点,可以利用break if命令,如下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
从断点继续运行:continue 命令


断点管理

(gdb) info break :显示当前gdb的断点信息。

(gdb)delete breakpoints num:删除第num个断点,简写d。

(gdb)clear number:清除源文件中某一代码行上的所有断点(注:number 为源文件的某个代码行的行号)。

(gdb)enable breakpoints:启用断点。

(gdb)disable breakpoints:禁用断点。

信息查看

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l。

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt。

(gdb)info:查看函数内部局部变量的数值,简写i。

(gdb)print:打印值及地址,简写p。

(gdb)watch:被设置观察点的变量发生修改时,打印显示。

(gdb)i watch:显示观察点。

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元。

用gdb查看内存

格式: x /nfu

说明
x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节

函数调用 | 栈帧切换

(gdb)call name:调用和执行一个函数。

(gdb)finish:结束当前函数,返回到函数调用点。

(gdb)frame:切换函数的栈帧,简写f。

(gdb)up n:表示向栈的上面移动n层,可以不打n,表示向上移动一层。

(gdb)down n:表示向栈的下面移动n层,可以不打n,表示向下移动一层。

GDB查看,执行汇编语言

(gdb) disassemble:查看汇编代码。

机器语言工具

有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目 前每一台计算机中实际使用的4个寄存器的标准名字:

$pc :程序计数器
$fp :帧指针(当前堆栈帧)
$sp :栈指针
$ps :处理器状态

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值