GDB的常见用法

GDB的常见用法

1. 编译文件

gcc -g test.c -o test

编译时默认不会把debug选项加进去,需要在编译时手动添加-g来加入debug。

运行GDB,用file来指定文件。

2.常见用法

  1. b(breakpoint)

    在函数下断点。

    b 行数

    在文件的第几行下断点。

  2. r (run)

    run程序,在即将执行断点之前停下。

  3. n(next)

    不进入函数的单步执行。

  4. 回车

    执行上一步的命令。

  5. s(step)

    进函数的单步。

  6. k(kill)

    kill当前进程。

  7. info b

    查看当前断点。

  8. d 符号

    除去符号处断点。

  9. c

    直接执行到下一个断点。

  10. bt

    查看函数调用栈。

  11. watch point

    监视某一个变量,运行到变量变化的地方停下。

  12. info r

    查看所有寄存器的值。

  13. info variables

    打印所有符号。

  14. p(print) point

    查看变量值。

  15. /x

    以十六进制输出。

  16. layout src

    以图形化模式的c语言gdb。以ctrl+x,a退出。

  17. layout split

    显示源代码和汇编指令窗口

  18. layout reg

    显示寄存器窗口

  19. layout asm

    以汇编模式gdb,汇编单步是si

  20. list

    查看源代码。

  21. q(quit)

    退出gdb。

显示内存数据

p系列

  1. p system/main

    显示某个函数地址

  2. p $esp

    显示寄存器

  3. p 0xff - 0xea

    计算器

  4. print &varName

    查看变量地址

  5. *p 0xffffebac

    查看某个地址处的值

x系列

命令格式:x/ <n/f/u>

n 是一个正整数,表示需要显示的内存单元个数,(默认为1)

f 表示显示格式(b字符,s字符串,i汇编指令,x十六进制,d十进制)默认为十六进制

u 表示从当前地址往后请求的字节数,默认为4byte ,b表示单字节,h表示双字节,w表示4字节,g表示8字节。

info系列

  1. info registers $ebp 查看寄存器ebp中的内容(简写为 i r ebp)
  2. i r eflags 查看状态寄存器
  3. i r ss 查看段寄存器
  4. i b 查看断点信息
  5. i function 看看所有函数

disas系列

  1. disas addr

    查看addr处前后的反汇编代码

  2. disas function

    查看function函数的反汇编代码

  3. disas <begin_addr> <end_addr>

    反汇编从开始地址到结束地址的部分

peda带有

  1. stack 20

    查看栈内20个值

  2. show args

    查看参数

  3. **vmmp **

    查看映射状况

  4. **readelf **

    查看elf文件中各个段的起始地址

  5. parseheap

    显示堆状况

查找字符串

  1. find

    查找字符串

  2. searchmem

    查找字符串

  3. ropsearch “xor eax,eax;ret” 0x8048080 0x80050000

    查找某段的rop

3.GDB的小技巧

  1. shell
shell ls

通过shell调用终端命令。

  1. 日志模式
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 - 列出所有运行中/激活进程

12个Linux进程管理命令介绍12个Linux进程管理命令介绍

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值