安装插件

1. 安装GDB增强工具 (gef)
  * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
2. GDB安装插件(在root权限安装,用户权限使用不了需要在用户权限下安装)
  git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins  (安装gdb的Python脚本插件)
  echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit    (默认打开gdb插件是pada)  倾向于破解和逆向
  echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit      倾向于debug 逆向
  echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit    个人定制

pwndbg安装
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

cat .gdbinit

3.Linux程序发布流程
  * 确定程序是否存在符号表
    readelf -s test-1
  * 生成符号表
    objcopy --only-keep-debug test-1 test-1.symbol
  * 生成发布程序
    objcopy --strip-debug test-1 test-release
  * 使用符号表进行程序debug
    gdb -q --symbol=test-1.symbol --exec=test-release

gdb 语法的使用
gcc -g -o main main.c
gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)-tui 选项开启gdb命令输入和源代码的分屏显示 main
分别在父进程和子进程的位置设置好断点(b 18), 然后r运行程序即可断下来:
所有命令,只要不出现冲突,都可以进行简写,如list可直接简写为l,break可直接简写为b。

list 行号/函数名 查看指定位置的源码
info break|watch|... 显示断点信息,watch 信息

break 行号/函数名 设置断点
tbreak/tb 临时断点(断点只生效一次)
del/clear 删除断点
ingore (ignore N COUNT)忽略断点N,次数为COUNT,即前COUNT次断点不触发

start 运行(自动在main函数处停下)
run 运行程序
next 单步运行,不进入函数内部
step 单步运行,进入函数内部
ni 下一条指令
si 进入函数(汇编级)
continue 继续运行,直到结束或者断点
n 10 运行10行代码
ni 10 运行10条指令
until 退出循环
finish 退出函数(相当于是快进)
return 退出函数(它是强制退出,跳过了中间的指令)
call 调用函数

watch 变量|表达式 观察变量或表达式,若其改变则停止
print 变量|表达式 查看程序运行时对应的变量或表达式的值
set 变量=新值 设置变量在内存中的当前值
backtrace/bt 若程序宕掉,查看函数调用栈
display 自动打印变量(每次程序暂停,都自动打印)
x 参数为内存地址,打印内存(help x查看用法)
info reg all 打印所有寄存器

条件断点:比如 b foo if a==1 ,条件成立是触发断点
执行shell命令(在命令前输入shell即可,比如shell clear就相当于是执行了shell中的clear命令,清屏)

stack 50 查看连续50个调用栈
vmmap 查看程序的段
heap
bins
distance addr1 addr2 计算两个内存的距离

x/<n/f/u> <addr> 来查看内存地址中的值
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
f 表示显示的格式,如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
  x 按十六进制格式显示变量。
  d 按十进制格式显示变量。
  u 按十六进制格式显示无符号整型。
  o 按八进制格式显示变量。
  t 按二进制格式显示变量。
u 参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。
当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
x/40gz 从指定地址向后查看40个内存值,8字节对齐16进制显示

多进程调试
设置follow-fork-mode (parent/child)和detach-on-fork (on/off)的值来调试子程序
follow-fork-mode detach-on-fork
  parent on 只调试主进程(GDB默认)
  child on 只调试子进程
  parent off 同时调试两个进程, gdb跟主进程, 子进程block在fork位置
  child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

set follow-fork-mode child
set detach-on-fork off
show follow-fork-mode/detach-on-fork

进程间切换
gdb会为inferiors分配ID, 其中带有*的进程是正在调试的inferior;gdb将每一个被调试程序的执行状态记录在一个名为inferior的结构中;
info inferiors 查看当前此时显示gdb调试的所有inferior
inferior ID切换到对应id的断点进程

多线程调试
gcc -g -o thread -lpthread thread.c
info threads 来查看有多少个线程
thread threadID 切换调试的线程
show non-stop 查看线程调试时运行的模式
show scheduler-locking
set scheduler-locking on|off|step
  on 锁定其他线程,只有当前线程执行
  off 不锁定任何线程
  step 只有被调试线程运行
thread apply threadID gdbCmd 指定某线程执行某gdb命令
thread apply all gdbCmd 全部的线程执行某gdb命令

程序静态/动态分析工具
IDA Pro/ winhex pedit binwalk(识别压缩壳,解压等)
readelf c++filter
OllyDebug
gdb

gdb插件调试的常用命令
peda
aslr on|off
aslr
dumprop
elfheader
elfsysmbol
dumpargs

checksec
  canary 栈保护 加入cookie
  NX 栈不可执行
  PIE(alsr) 每次执行内存地址随机化
  Fortify 栈参数保护检测
  relro GOT只读

参考:

汇编:https://blog.csdn.net/weixin_51325053/article/details/117511668
https://www.136.la/mysql/show-44335.html
https://blog.csdn.net/qq_29809823/article/details/118941735
多线程: https://blog.csdn.net/weixin_42158742/article/details/113100151
多进程: https://blog.csdn.net/qq_40827990/article/details/110423679

x命令:https://blog.csdn.net/u013985241/article/details/89169007

gdb 常用命令总结的更多相关文章

  1. Linux GDB常用命令一栏

    Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...

  2. gdb常用命令记录

    gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...

  3. GDB常用命令系列

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions.html 本文为索引,请点击以下链接进行阅读: GDB调试原理——p ...

  4. GDB常用命令使用说明(一)

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions1.html 全部关于gdb的文章索引请点这里 GDB(GNU Deb ...

  5. gdb 常用命令总结(精优)

    格式说明: [xxx]:可选参数,即可以指定可以不指定,实际输入的内容是 xxx <xxx>:占位参数,即必须指定的参数,实际输入的内容是 xxx gdb 常用命令: gdb [file] ...

  6. C 调试 gdb常用命令

    gdb常用命令: [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) b ...

  7. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  8. 第04课:GDB常用命令详解(上)

    本课的核心内容如下: run命令 continue命令 break命令 backtrace与frame命令 info break.enable.disable和delete命令 list命令 prin ...

  9. 第07课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...

  10. 第06课:GDB 常用命令详解(中)

    本课的核心内容: info 和 thread 命令 next.step.util.finish.return 和 jump 命令 info 和 thread 命令 在前面使用 info break 命 ...

随机推荐

  1. Mybatis-概览地图

    思考: "为什么在使用 Mybatis 的时候,只需定义一个接口,不用写实现类就能使用XML中或者注解上配置好的SQL语句,就能完成对数据库 CRUD 的操作呢?" 这是因为用到了 ...

  2. Source Insight 4.0 常用快捷键小记

    1. 括号配对高亮:"在前括号左侧,后括号左侧" 双击鼠标左键,可以选定匹配括号和其中内容(<>,(),L{R},[]之间) 高亮当前单词 : F8 语法窗口(隐藏/显 ...

  3. CF1098D 题解

    题意 传送门 对于一个元素个数大于 \(1\) 的可重集,每次取出两个数 \(x,y\) 合并.若 \(x\le y\le 2x\),则称其为危险合并.重复上述操作至无法合并. 给你一个初始为空的可重 ...

  4. KCL 语言和 YAML 字符串的区别是什么?一文完全解答

    什么是 YAML YAML 是一种数据序列化语言,通常用于编写配置文件.YAML 代表另一种标记语言或YAML 不是标记语言(递归首字母缩写词),YAML 通常用于数据,而不是文档.YAML 还是一种 ...

  5. 从零开始升级基于RuleBased的聊天机器人

    这里记录从最基础的基于规则的聊天机器人,升级到基于逻辑的机器人,再升级到调用Google提供的API来让机器人能说.会听普通话. 最基本的完全基于规则式的问答:问什么就答什么,幼儿园水平. impor ...

  6. 同一个tomcat的项目跳转

  7. kail 系统更新

    原文链接:https://blog.csdn.net/aiming66/article/details/123203495

  8. springcloud 整合email的坑(Unrecognized SSL message, plaintext connection?)

    springcloud整合email真的是搞得我脑壳痛,因为我需要注册的时候通过rabbitmq给用户发一封邮件,因为这个报错的原因导致我mq一直监听失败然后就开始了循环发消息,这就导致邮箱一直在不停 ...

  9. springcloud zuul网关整合swagger2,swagger被拦截问题

    首先感谢一位博主的分享https://www.cnblogs.com/xiaohouzai/p/8886671.html 话不多说直接上图和代码 首先我们要有一个springcloud分布式项目 我就 ...

  10. leecode76. 最小覆盖子串

    76. 最小覆盖子串 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: ...