GDB的常见用法
1. 编译文件
gcc -g test.c -o test
编译时默认不会把debug选项加进去,需要在编译时手动添加-g来加入debug。
运行GDB,用file来指定文件。
2.常见用法
b(breakpoint)
在函数下断点。
b 行数
在文件的第几行下断点。
r (run)
run程序,在即将执行断点之前停下。
n(next)
不进入函数的单步执行。
回车
执行上一步的命令。
s(step)
进函数的单步。
k(kill)
kill当前进程。
info b
查看当前断点。
d 符号
除去符号处断点。
c
直接执行到下一个断点。
bt
查看函数调用栈。
watch point
监视某一个变量,运行到变量变化的地方停下。
info r
查看所有寄存器的值。
info variables
打印所有符号。
p(print) point
查看变量值。
/x
以十六进制输出。
layout src
以图形化模式的c语言gdb。以ctrl+x,a退出。
layout split
显示源代码和汇编指令窗口
layout reg
显示寄存器窗口
layout asm
以汇编模式gdb,汇编单步是si。
list
查看源代码。
q(quit)
退出gdb。
显示内存数据
p系列
p system/main
显示某个函数地址
p $esp
显示寄存器
p 0xff - 0xea
计算器
print &varName
查看变量地址
*p 0xffffebac
查看某个地址处的值
x系列
命令格式:x/ <n/f/u>
n 是一个正整数,表示需要显示的内存单元个数,(默认为1)
f 表示显示格式(b字符,s字符串,i汇编指令,x十六进制,d十进制)默认为十六进制
u 表示从当前地址往后请求的字节数,默认为4byte ,b表示单字节,h表示双字节,w表示4字节,g表示8字节。
info系列
- info registers $ebp 查看寄存器ebp中的内容(简写为 i r ebp)
- i r eflags 查看状态寄存器
- i r ss 查看段寄存器
- i b 查看断点信息
- i function 看看所有函数
disas系列
disas addr
查看addr处前后的反汇编代码
disas function
查看function函数的反汇编代码
disas <begin_addr> <end_addr>
反汇编从开始地址到结束地址的部分
peda带有
stack 20
查看栈内20个值
show args
查看参数
**vmmp **
查看映射状况
**readelf **
查看elf文件中各个段的起始地址
parseheap
显示堆状况
查找字符串
find
查找字符串
searchmem
查找字符串
ropsearch “xor eax,eax;ret” 0x8048080 0x80050000
查找某段的rop
3.GDB的小技巧
- shell
shell ls
通过shell调用终端命令。
- 日志模式
set logging on
- 点
断点分为breakpoint(断点)和watchpoint(观察点)和catchpoint(捕捉点)。
4.调试挂掉的文件(core文件)
#include<stdio.h>
int main(){
int* temp = NULL;
*temp = 10;
return 0;
}
core一般比较大,不会默认生成。要去更改权限。
用ulimit去查看限制。
unlimit -a
更改core文件生成权限。
ulimit -c unlimited
gdb 二进制文件 core文件。
gdb test.c core
5。调试一个正在运行的程序
#include<stdio.h>
void test(){
}
void test1(){
int i = 0;
i++;
}
int main(){
for(;;){
test();
test1();
}
return 0;
}
ps:在运行一个程序时可以在后面加上&来让程序在后台执行。
./a.out &
gdb -p pid
6.其他有用的linux命令
ps命令
ps -a - 列出所有运行中/激活进程
ps -ef |grep - 列出需要进程
ps -aux - 显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等
kill命令
这个命令用于发送信号来结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用-9参数来执行。注意,使用强制杀死的时候一定要小心,因为进程没有时机清理现场,也许写入文件没有完成。如果我们不知道进程PID或者打算用名字杀死进程时候,killall就能派上用场。
kill <pid>
kill -9 <pid>
killall -9 - 杀死所有拥有同样名字的进程
如果你使用kill,你需要知道进程ID号。pkill是类似的命令,但使用模式匹配,如进程名,进程拥有者等。
pkill <进程名>
cp命令
cp 即拷贝文件和目录。
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory
详细的视频资料在https://www.bilibili.com/video/BV1EK411g7Li?p=5&share_source=copy_web