Commen Instructions
以下指令都在进入GDB终端之后使用~
运行文件
添加参数:
sh1
2
3
4
5set args [arg1] [arg2] ... Or
r -[arg1] -[arg2] ...
# check args
show args开始运行:
run
: 默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;start
: 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
运行过程中
代码执行命令:
next(n)
:单步执行,如果有函数调用,不会进入该函数step/s
:单步执行,如果有函数调用,会进入该函数- 🌟
si
🌟:单步执行(汇编语句) continue(c)
:继续运行set step-mode on/off
:打开/关闭step-mode模式,该模式使得在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码finish
:运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息until(u)
:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体
打印某个变量的值:
print/p val
Code1
2
3
4
5
6
7
8x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。其他详细用法可见GDB print 高级用法
观察点
Watchpoint
:观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点:watch
:为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch
:当表达式(变量)expr被读时,停住程序。awatch
:当表达式(变量)的值被读或被写时,停住程序。info watchpoints
:列出当前所设置了的所有观 察点。
断点
Breakpoint
断点添加方式
如果想在指定的地址设置断点,比如在main
函数的地址出设断点。可用info add main
获得main
的地址如0x80484624
,然后用break *0x80484624
。条件断点就是在如上述指定断点的同时指定进入断点的条件。sh1
2
3
4
5
6
7
8
9# 普通断点
break 10
break test.c:10
break main
break test.c:main
break 10 if index == 3
tbreak test.c:l0 # 临时断点(只生效一次的断点)
ignore 1 30 # 跳过多次设置断点,该命令的含义是将断点1跳过30次查看断点:
info breakpoints/break
禁用/启动断点
sh1
2
3
4
5disable # 禁用所有断点
disable bnum # 禁用断点bnum
enable # 启用所有断点
enable bnum # 启用断点bnum
enable delete bnum # 启动断点bnum,并且在此之后删除该断点删除断点
sh1
2delete # 删除所有breakpoints, watchpoints和catchpoints
delete bnum # 删除断点号为bnum的断点
查看当前状态
打开/关闭源代码展示窗口:
tui enable/disable
(还能显示PC)🌟反汇编🌟:
disassemble/disas
当前汇编代码:
layout asm
当前寄存器信息:
layout reg
-
backtrace/bt
:打印当前的函数调用栈的所有信息sh1
2
3
4
5# example
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6从上可以看出函数的调用栈信息:
__libc_start_main --> main()--> func()
,backtrace/bt <-n>
表示只打印栈底下n层的栈信息。frame/f
:会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。info frame/f
:这个命令会打印出更为详细的当前栈层的信息(大多数都是运行时地址)。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。sh1
2
3
4
5
6
7
8
9(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8其他信息:
sh1
2
3
4
5info args # 打印出当前函数的参数名及其值。
info locals # 打印出当前函数中所有局部变量及其值。
info catch # 打印出当前的函数中的异常处理信息。
list linenum/funciton/first, last # 显示源代码
其他
- 定位段错误
- 简单方法:调用gdb后输入
file a.out
,然后再输入run
,就能发现段错误所在位置,然后通过p 变量
指令,查询所在位置变量的值的情况。 - 利用core文件定位
- 简单方法:调用gdb后输入
- 定位段错误