当前位置: 首页 > article >正文

Linux--gdb/cgdb

ok,我们今天学习gdb的安装和使用

调试器-gdb/cgdb使用

VS、VScode编写的代码一般都是release格式的,gdb 的格式一般是debug

换成debug模式命令 :-g

gdb会记录最新的一条命令,直接回车就是默认执行该命令

一个调试周期下,断点编号递增,删除断点,之后的断点编号也是递增

样例代码

 // mycmd.c
 #include <stdio.h>
 int Sum(int s, int e)
 {
 int result = 0;
     for(int i = s; i <= e; i++)
     {
         result += i;
     }
         return result;
 }
 int main()
 {
     int start = 1;
     int end = 100;
     printf("I will begin\n");
     int n = Sum(start, end);
     printf("running done, result is: [%d-%d]=%d\n", start, end, n);
     return 0;
 }

预备

程序的发布⽅式有两种,debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程序,默认是

release 模式。

VS、VScode编写的代码一般都是release格式的,gdb 的格式一般是debug

换成debug模式命令 :-g

要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候,加上 -g 选项,如果没有添加,程序⽆法被编译

$ gcc mycmd.c -o mycmd       # 默认模式,不⽀持调试
$ file mycmd
 mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically 
linked, interpreter /lib64/ld-linux-x86-64.so.2, 
BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux 
3.2.0, not stripped

$ gcc mycmd.c -o mycmd -g    # debug模式
$ file mycmd
 mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically 
linked, interpreter /lib64/ld-linux-x86-64.so.2, 
BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux 
3.2.0, with debug_info, not stripped

常见使用

  • 开始: gdb binFile
  • 退出: ctrl + d 或 命令 quit 调试命令

gdb会记录最新的一条命令,直接回车就是默认执行该命令

一个调试周期下,断点编号递增,删除断点,之后的断点编号也是递增

命令作用样例
list / l

显示源代码,从上次位置开始,每次列出

10
list / l 10
list / l  函数名列出指定函数的源代码list / l main
list / l     文件名: 行号列出指定文件的源代码list / l mycmd. c : 1
r / run从程序开始连续执行run
n / next单步执行,不进入函数内部next
s / step单步执行,进入函数内部step
break / b  [文件名:] 行号在指定行号设置断点

break 10

break test. c:10
break / b 函数名在函数开头设置断点break main
info break / b查看当前所有断点的信息info break
finish执行到当前函数返回,然后停止finish
print / p 表达式打印表达式的值print start + end
p 变量打印指定变量的值p x
set var   变量=值修改变量的值set var i=10
continue / c从当前位置开始连续执行程序continue

delete / d

breakpoints
删除所有断点delete breakpoints

delete / d

breakpoints n
删除序号为n的断点delete breakpoints 1
disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints
info / i breakpoints查看当前设置的断点列表info breakpoints
display 变量名跟踪显示指定变量的值 (每次停止时)display x
undisplay 编号取消对指定编号的变量的跟踪显示undisplay 1
until X 行号执行到指定行号until 20
backtrace / bt查看当前执行栈的各级函数调用及参数backtrace
info / i locals查看当前栈帧的局部变量值info locals
quit退出GDB调试器quit

断点 + finish + until + c:快速定位问题

如果想看到代码调试,可以使用cgdb

下载代码:

sudo yum install -y cgdb

watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB会暂 停程序的执⾏,并通知使⽤者

watch result ,在之后的调试的过程中如果监视的内容发生改变,则会自动显示出来

(gdb) watch result

set var确定问题原因

set var 可以改变想要改变的变量的值,根据结果判断问题的原因

 (gdb) set var flag=1 

条件断点

b n if x==y 设置条件断点,当系统经过断点停下时,就可以判断现在的条件

(gdb) b 9 if i == 30 # 9是⾏号,表⽰新增断点的位置

给已有断点新增条件

(gdb) b 9 #我们在第9⾏新增⼀个断点,⽤来开始测试

(gdb) condition 2 i==30 #给2号断点,新增条件i== 30
  • 条件断点添加常⻅两种⽅式:1.新增2.给已有断点追加 
  • 注意两者的语法有区别,不要写错了。 
  • 新增:b⾏号/⽂件名:⾏号/函数名ifi==30(条件)
  • 给已有断点追加:condition2i==30,其中2是已有断点编号,没有 if

少年没有乌托邦,心向远方自明朗!

如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助
欢迎各位点赞,收藏和关注哦
如果有疑问或有不同见解,欢迎在评论区留言
后续会继续更新大连理工大学相关课程和有关Linux的内容和示例
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!

ok,我们下次再见!


http://www.kler.cn/a/584897.html

相关文章:

  • Oracle RAC 三种心跳机制
  • 微信小程序审核失败,你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目 解决
  • ES6回顾:闭包->(优点:实现工厂函数、记忆化和异步实现)、(应用场景:Promise的then与catch的回调、async/await、柯里化函数)
  • Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动出错
  • 鸿蒙移动应用开发--UI布局基础
  • websocket学习手册及python实现简单的聊天室
  • Docker基础命令说明
  • 爬虫案例十五js逆向七麦数据
  • MySQL Buffer Pool、Undo Log、脏页详解
  • 树莓科技集团董事长:第五代产业园运营模式的深度剖析与展望​
  • MATLAB—从入门到精通的第三天
  • uniapp上传文件问题以及返回上一页出现退出app的问题记录
  • Flutter_学习记录_video_player、chewie 播放视频
  • 80.Dictionary 字典 C#例子
  • 数据库学习笔记
  • CSS3 用户界面设计指南
  • Go执行当前package下的所有方法
  • 微信小程序校园跑腿的设计与实现【lw+源码+部署+视频+讲解】
  • SpringBoot使用Logback日志框架与综合实例
  • 在 WSL中批量执行InSAR任务-stackSentinel.py