gdb调试

本文主要讲解使用linux系统进行编程的一个完整流程

vim

Linux系统中最常用的编辑器,被称为“编辑器之神”。相比于vi,vim编辑器是他的升级版,在兼容vi的情况下,加入了很多其他新的特性。

特性

  • 全屏编辑器,字符界面,非图形界面
  • 工作模式:
    • 命令模式:复制、剪切、粘贴、查找、保存退出登
    • 文本模式:添加、修改等文本编辑操作
    • 扩展模式:在末执行复杂的命令
  • 使用单字母命令
  • 通过模式匹配可以进行复杂的查找和替换
  • 通过宏支持用户定义功能

工作图

在这里插入图片描述

相关指令

启动vi编辑器:vi vifile - “vifile”不存在将会创建一个新文件

启动后首先进入命令模式,键如以下字符进入文本模式

  • a:在光标后添加(add)文本
  • i:在光标前(insert)文本
  • A:在光标所在的行末添加文本
  • I:在光标所在的行首插入文本
  • o:在光标所在的下一行输入文本
  • O:在光标所在的bbbbbbb上一行输入文本
删除文本
  • x:删除光标所在字符
  • dw:删除光标所在单词(word)
  • d$:删除光标至行末的所有字符
  • d0:删除光标所在行首的左右字符
  • dd:删除一行
  • u:撤销操作
  • . :重复上一次操作
  • :20,40d:删除从20-40行(扩展模式)
操作
  • yy:复制行数据
  • dd:删除行(实际是剪切 也可以 n dd)
  • p:粘贴
  • 在字符上按r,之后输入需要替换的字符
  • :wq:保存
  • :q!:强制退出
  • :set nu:显示行号
  • :set nonu:取消行号
移动光标
  • <Ctrl - f> 向上翻页
  • <Ctril - b> 向下翻页
  • <Ctrl - u>
  • gg:跳至文首
  • <shift - g> 跳至文末
  • n 向下移动n行
  • n+上/下/左/右:可以移动n个字符
  • 命令模式下o:后方插入空白行
  • 命令模式下O:前方插入空白行
文本替换
  • : s/old/new - 用new替换当前行第一个old。
  • : s/old/new/g - 用new替换当前行所有的old。
  • :n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
  • :%s/old/new/g - 用new替换文件中所有的old。
  • :%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
  • :%s/表示行尾。
  • 所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。
  • /g:替换所有(global)的关键字
分屏操作
  • :new:打开空白屏
  • :only:取消分屏
  • <Ctrl + W>:切换
    • <Ctrl + W> + 扩大窗口
    • <Ctrl + W> - 缩小窗口
    • <Ctrl + W> h 跳转到左边的窗口
    • <Ctrl + W> j 跳转到下边的窗口
    • <Ctrl + W> k 跳转到上边的窗口
    • <Ctrl + W> l 跳转到右边的窗口
    • <Ctrl + W> t 跳转到最顶上的窗口
    • <Ctrl + W> b 跳转到最顶下的窗口

gcc

使用vim编写好程序之后,需要对程序进行编译、汇编等操作,此时就需要使用到gcc编译器来编译源文件。

相关命令

gcc -o file file.c

  • -o name.out:编译,输出,指定编译后的文件名字,不然默认为a.out
  • -c test1.c test2.c test3.c:编译、汇编但是不连接,生成.o文件
  • -g:生成调试信息,该程序可以被调试器调试
  • -E circle.c -o circle.i:预处理指定的源文件,不进行编译,生成.i文件
  • -S:编译指定的源文件,但是不进行汇编,生成.s文件
  • -I dir:指定 include 包含文件的搜索目录
  • -save-temps:不删除生成的中间文件

gdb

编译过程大多不会是一次成功的,所以我们要反复修改程序bug,这时就需要使用gdb调试工具来一步步的剖析我们的程序

注意:只用经过gcc -g选项编译的.out程序可以通过gdb进行调试

  1. 通过gdb file.out进入调试步骤

  2. 参数列表

    • 命令/命令缩写:命令说明
    • list l:显示多行源代码
    • break b:设置断点,程序运行到断点的位置会停下来(break func / n:在函数func或者第n行设置断点)
    • delet 断点号n:删除第n个断点
    • disable 断点号n:暂停第n个断点
    • enable 断点号n:开启第n个断点
    • run r:开始运行程序
    • display disp:跟踪查看某个变量,每次停下来都显示它的值
    • step s:执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句
    • next n:执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)
    • stepi si nexti ni:用于单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,此语句可以单步执行机器指令
    • set step-mode on/off:进行单步跟踪是,程序不会因为debug信息而不停住,此参数设置可便于查看机器码
    • print p:打印内部变量值
    • continue c:继续程序的运行,直到遇到下一个断点
    • set var name=v:设置变量的值
    • start st:开始执行程序,在main函数的第一条语句前面停下来
    • file:装入需要调试的程序
    • kill k:终止正在调试的程序
    • watch:监视变量值的变化
    • backtrace bt:产看函数调用信息堆栈
    • frame f:查看栈帧
    • quit q:退出GDB环境
  3. gdb -q filename:不出现过多的文字

    • info i:描述程序的状态
    • info break[n] / breakpoint[n] / break:显示第n个断点 / 所有断点
    • info reg:查看寄存器的信息
    • print p:打印内部变量值(p result[2] = 33 // p printf(“%d”,result[2]);)
  4. 查看内存地址x/<n/f/u><addr>

    eg:x /4bt 地址(&x)

    • n:需要显示的内存单元个数

    • f:显示的格式 — s:字符串 u:无符号十进制 i:指令地址

      • x(hex) 按十六进制格式显示变量。
      • d(decimal) 按十进制格式显示变量。
      • u(unsigned decimal) 按十进制格式显示无符号整型。
      • o(octal) 按八进制格式显示变量。
      • t(binary) 按二进制格式显示变量。
      • a(address) 按十六进制格式显示变量。
      • c(char) 按字符格式显示变量。
      • f(float) 按浮点数格式显示变量
    • u:从当前地址往后请求的字节数,默认4个bytes

      (b - 单字节 h- 双字节 w- 四字节 g- 八字节)

  5. 查看寄存器p/x %eda

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值