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,我们下次再见!