GDB学习--基本操作

本文最后更新于:2021-11-03 下午

前言

记录一下学习GDB的一些东西,也不是所有的完全指令,主要还是一些日常用的。

在这里记录了一些比较全的命令,随时可以查看这里

https://github.com/evilpan/awesome-cheatsheets/blob/master/tools/gdb.txt

GDB的一些命令

先写一个小DEMO用来后面的GDB调试

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
int x=10;
int y=5;
printf("sum is %d\n",add(x,y));
return 0;
}

输入命令gdb,就可以打开gdb了,如图是gdb的界面。

先列出一些gdb的常用指令。

命令 功能
run-r 运行程序,如果碰到断点的话就会停下来
break-b 设置断点
help-h 帮助菜单
step-s 单步步进,就是OD里的F7
next-n 单步步过,也就是OD里的F8
finish-fin 执行程序直到指定的栈帧返回,也就是调用了一个函数,执行到retn再执行retn
print-p 打印一些信息
quit-q 退出

GDB操作

打开gdb之后,输入file + 文件名 即可将文件附加进去。

输入start命令可以停在main函数处,与run命令的区别是,后者是运行碰到断点停下,前者是停在main函数处。

断点类

break指令可以下断点,快捷是b,不带任何参数时,是在所选栈帧中执行的下一条指令处下断。

b func:对函数下断,如图对main和add函数下断。

b line:在当前源代码的指定行下断。

b file:line:在源码文件的line行处下断。

b file:function:在源码文件的function处下断。

b *addr:在程序指定地址处下断。

info breakpoints:可以列出当前所有的断点信息,快捷i b

delete num:删除指定编号的断点。

clear function:删除指定函数的断点

delete:删除所有断点

运行类

run:运行程序

run args:以某参数运行程序

set args (args):设置参数

show args:查看当前的运行参数

step:单步步入,碰到函数会进入,就是OD中的F7。

step count:单步conut次

next:单步步过,OD中的F8

next count:单步count次

finish:结束当前函数的运行

kill:杀死当前运行的函数

栈帧

bt:打印当前backtrace

frame:显示当前运行的栈帧

浏览数据

print expression :打印表达式,可以简写为p

p /x expression:十六进制输出

p /x $寄存器:十六进制打印寄存器的值

x/<n/f/u> <addr>:打印指定地址的内存数据,其中n是一个正整数,表示显示内存的长度;f是显示的格式,字符串可以是s,指令地址可以用i;u表示从当前地址往后请求的字节数,不指定的话默认是4字节,b代表单字节,w表示4字节,g表示8字节。

输出格式:

  • x 按十六进制格式显示变量;
  • d 按十进制格式显示变量;
  • u 按十六进制格式显示无符号整型;
  • o 按八进制格式显示变量;
  • t 按二进制格式显示变量;
  • a 按十六进制格式显示变量;
  • c 按字符格式显示变量;
  • f 按浮点数格式显示变量。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!