Linux开发——GDB调试及常用命令

目录

 

小记

gdb调试命令

多进程常用命令

多线程常用命令

linux程序发布流程

反调试技术


小记

安装GDB插件gef    gdb7.7以上才能用   且程序编译时 -g  才能用gdb调试

#下载三个插件
git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins

对应启动命令:
echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit 
echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit 
echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit  

查看进程命令  ps -A         查看特定进程  ps -ef | grep hello          查看进程目录   which hello

gdb启动命令:

                     本地启动:gdb  路径          

                      本地段错误文件启动:gdb 路径 core

                                 ulimit -c  查看当前文件句柄

                                 sudo ulimit -c unlimited 设置无限大存储core文件

                      attch方式启动 gdb 路径 pid       gdb /home/wd/hello 2946

                      远程启动 gdbserver 0.0.0.0:6666 /path/to/file

gdb调试命令

指定文件方法  命令 xxx.c:xxxx

1.设置函数参数   set args 100 200 

                   set env USER = hcen 设置环境变量

                   set step-mode 设置单步跟踪 取消命令 set step-mode no

                   set detach-on-fork off  挂起所有进程 父进程和子进程都卡住 反之xxx on   放行一个进程 detach inferiors <进程编号>

                   set follow-fork-mode <child/parent>  设置跟随子进程还是父进程    同类 set follow-fork-mode <new/same>

2.查看函数  l /list    显示位置(函数名 行数等)    例:l main   或者  list main

                  设置显示行数 set listsize 20   //上下显示10行

3.断点 b/break 断点位置(行数 函数名) 例: b 18  或者 b sum   或者 b hello.c:18

                  info breakpoints 查看当前所有断点

                  disable 断点号   设置该断点失效

                  delete 断点号  删除该断点

                  b 行号 if 条件         条件断点 例: b 22 if i==90

                   b * 0x8048361      在某个地址上打断点

                  watch 参数       内存断点  当读取这块内存时断点 用rwatch 参数 移除

4.运行程序 r/run

5.单步运行 ,有函数进入 s/step

6.单步运行,有函数跳过 next /n

                  ni  执行下一条指令  汇编指令

7.完成函数调用并返回 finish/f

8.运行到函数结束或断点 continue/c

9.查看程序调用堆栈 backtrace/bt

                  info frame 栈号   查看该栈号的栈帧

                  frame <int>  查看第多少个栈帧

10.查看内存 examine/x

                  x/(大小int)(单位b一字节h两个字节w四个字节g八个字节)(进制x f字符串 d i代码。。。)

                                 例:x/20gz 0x.....

                  vmmap  查看地址段

                                 401000  开头的是  代码段地址

                                 601000 开头的是  堆地址

11.反汇编代码 disassemble

12. 查看命令info

          12.1查看寄存器 info registers/i r

                   第一个参数rdi  第二个参数rsi   第三个参数rdx  第四个参数rcx    r8    r9   其余参数在栈里 压栈寄存器rsp

                   32位程序 直接压栈 寄存器esp 从右到左

                   上一个函数的返回值储存在寄存器  rax   中

          12.2查看变量 info locals /i lo       p $rsp 当前运行地址       p $rip  当前运行操作

          12.3 查看程序用到的终端模式 infor terminal

                   重定向输出    out>fileout

                   指写输入输出的终端设备 tty   例 tty /dev/tty0

          12.4 查看当前所有进程   info inferiors      进入一个进程  inferiors <pid>

13.打印信息 print/p 例:p reselt  或者p/s reselt (字符串打印) p/d reselt(十进制打印)   p/i reselt(代码打印)

             查看数组中的十个元素          p *a@10

14.立即跳出循环 until/u

15.指定符号表 symbol-file hello.symbol

16.设置程序执行路径  path <dir>

                show paths  查看程序运行路径

多进程常用命令

set follow-fork-mode parent/chile       设置接下来进入子进程还是父进程

set detach-on-fork on/off                    接下来创建的创建的子进程和当前父进程全部卡住

info inferiors                                        查看所有进程信息

detach inferiors 编号                          释放一个进程的卡住

多线程常用命令

thread thread-编号                             切换到某个线程

info threads                                         查看所有线程

thread apply [x-x] :cmd                       批量操作线程

set printf thread-events                       设置线程是否打印信息

set scheduler-locking  off/on/step       除当前线程:off不阻止所有线程 on所有线程锁定 step 同步调试

linux程序发布流程

1.查看文件是否存在符号表:   readelf -s/-S hello.gcc

2.剥离符号表操作:                 objcopy --only-keep-debug hello.gcc hello.debug

2.生成release程序操作:         objcopy --strip-debug hello.gcc hello.release  //可通过(strip hello.release)再次剥离

3.gdb调试

反调试技术

加壳 / 加花  (upx压缩壳 很low)

模糊头方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值