骑麦兜看落日

[Linux]GDB

字数统计: 1.6k阅读时长: 6 min
2018/09/27 Share

GDB


1.GDB介绍

GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.

GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:

  • Start your program, specifying anything that might affect its behavior.
  • Make your program stop on specified conditions.
  • Examine what has happened, when your program has stopped.
  • Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.

Those programs might be executing on the same machine as GDB (native), on another machine (remote), or on a simulator. GDB can run on most popular UNIX and Microsoft Windows variants, as well as on Mac OS X.


2.GDB安装

2.1环境

  • Ubuntu Linux 14.0.4
  • GDB 7.11.1

2.2安装

1
sudo apt-get install gdb

3.GDB调试

3.1启动

对于C/C++程序的调试需要在编译时加上-g选项:

1
gcc -g test.c -o test

3.2启动执行文件

1
gdb <program>

3.3启动运行程序和core文件

用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件

1
gdb <program> core

3.4启动服务程序

如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID.gdb会自动attach并调试.program应该在PATH环境变量中搜索得到

1
gdb <program> <PID>

3.5启动开关

简写 作用
-symbols -s 从指定文件中读取符号表
-se file 从指定文件中读取符号表信息,并把他用在可执行文件中
-core -c 调试时core dump的core文件
-directory -d 加入一个源文件的搜索路径.默认搜索路径是环境变量中PATH所定义的路径

4.GDB交互命令

指令 作用
r(run) 开始运行(不会断,可带参数)
c(continue) 继续执行
b * address 指定地址下断点
bl 查看断点列表
del index 删除指定断点
Ctrl + c 强制运行中的程序中断
print expr 打印出expr
bt 显示调用堆栈的信息
stack n 显示n个单元的栈
x/nf addr. 打印指定地址开始n个单元的内存数据,f表示单元大小(b为一个字节,h为双字节,wx为四字节,gx为八字节,i表示查看指令,c表示查看字符,s表示查看字符串)
find/search expr 在当前进程内存搜索expr的值,可以是整数或是字符串
n/ni(next into) 单步执行,不会进入函数
s/si(step into) 单步步入,遇到函数会进入,如果遇到n无法正常单步的情况下使用s/si替代使用
finish 跳出当前函数
return 忽略之后的语句,强制函数返回
list n 有源码的情况下列出n行当前指令对应的源码
set {type} $reg/mem=expr 设置对应寄存器或内存指向的值为expr,type可为int,long等
set $reg=expr 设置对应寄存器的值为expr
peda/pwndbg 查看可用命令
dump filename1 addr1 addr2 dump指定内存到文件中,dump命令之后还会跟一些其他指令用于特定的操作
q(quit) 退出gdb
gdb binary_path 使用gdb载入binary_path指定路径的程序
gdb –pid PID 使用gdb attach到指定pid的
命令 简写 作用
run r 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令
contnue c 继续执行,到下一个断点处(或运行结束)
next n 单步跟踪程序,当遇到函数调用时,不进入此函数体
step s 单步跟踪程序,当遇到函数调用时,进入此函数体
until / 运行程序直到退出循环体
until+行号 / 运行至某行,不仅仅用来跳出循环
finish / 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
call 函数(参数) / 调用程序中可见的函数,并传递’’参数’’
quit q 退出gdb

3.2.2设置断点

命令 简写 作用
break n b n 在第n行处设置断点
b fn1 if a>b 条件断点设置
break func b func 在函数func()的入口处设置断点
delete 断点号n 删除第n个断点
disable 断点号n 暂停第n个断点
enable 断点号n 开启第n个断点
clear 行号n 清除第n行的断点
info breakpoints info b 显示当前程序的断点设置情况
delete breakpoints 清除所有断点

3.2.3查看源代码

命令 简写 作用
list l 列出程序的源代码,默认每次显示10行,重复执行时输出下边的内容
list 行号 将显示当前文件以“行号”为中心的前后10行代码
list 函数名 将显示“函数名”所在函数的源代码

3.2.4打印表达式

命令 简写 作用
print 表达式 p 其中“表达式”可以是任何当前正在被测试程序的有效表达式
print a 将显示整数 a 的值
print ++a 将把 a 中的值加1,并显示出来
print name 将显示字符串 name 的值
print gdb_test(整数) 将以一个整数作为参数调用 gdb_test() 函数
print gdb_test(a) 将以变量 a 作为参数调用 gdb_test() 函数
display 表达式 在每次单步进行指令后,紧接着输出被设置的表达式及值
watch 表达式 设置一个监视点,一旦被监视的’’表达式’’的值改变,gdb将强行终止正在被调试的程序
whatis 查询变量或函数
info function 查询函数
info locals 显示当前堆栈页的所有变量

3.2.5查询运行信息

命令 简写 作用
where/bt 当前运行的堆栈列表
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数 指定运行时的参数
show args 查看设置好的参数
info program 来查看程序的是否在运行,进程号,被暂停的原因
magic 魔数
telecrope

4.调试assembly

命令 简写 作用
disassemble function 显示function的反汇编代码
b *address 在address处设置断点
set {int}address = num 设置address处的值为num
CATALOG
  1. 1. GDB
    1. 1.1. 1.GDB介绍
    2. 1.2. 2.GDB安装
      1. 1.2.1. 2.1环境
      2. 1.2.2. 2.2安装
    3. 1.3. 3.GDB调试
      1. 1.3.1. 3.1启动
      2. 1.3.2. 3.2启动执行文件
      3. 1.3.3. 3.3启动运行程序和core文件
      4. 1.3.4. 3.4启动服务程序
      5. 1.3.5. 3.5启动开关
    4. 1.4. 4.GDB交互命令
      1. 1.4.0.1. 3.2.2设置断点
      2. 1.4.0.2. 3.2.3查看源代码
      3. 1.4.0.3. 3.2.4打印表达式
      4. 1.4.0.4. 3.2.5查询运行信息
  2. 1.5. 4.调试assembly