linux下c/c++开发的 gdb调试器

疑问:

linux中已经安装了vscode,可以对程序进行调试,为什么还需要GDB命令行

        GDB是一个功能强大的命令行调试器,可以帮助程序员在程序崩溃或出现其他问题时进行调试。虽然VScode可以在图形界面下进行调试,但是GDB命令行调试器可以提供更加详细的信息和更加灵活的调试方式。此外,GDB还可以在没有图形界面的环境下进行调试,比如在服务器上进行远程调试。因此,尽管VScode可以进行调试,但是GDB命令行调试器仍然是一个非常有用的工具。

什么是GDB?

linux中,不借助IDE环境,我们可以通过命令行完成代码的开发、编译、和调试:

开发程序(命令行系統,没有IDE)中写代码,用vim;

调试用 gdb (打断点、单步调试、看变量值)(程序的逻辑错误);

编译用gcc

  • GDB(GNU Debugger)是一个用来调试C/C++程序的功能强大的调试器,是Linux系统开发C/C++最常用的调试器
  • 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量。
  • VSCode是通过调用GDB调试器来实现C/C++的调试工作的;

GDB主要功能:

  • 设置断点(断点可以是条件表达式)
  • 使程序在指定的代码行上暂停执行,便于观察
  • 单步执行程序,便于调试
  • 查看程序中变量值的变化
  • 动态改变程序的执行环境
  • 分析崩溃程序产生的core文件

 是不是我们在IDE调试时,干的事情一模一样?

 常用gdb调试命令参数

调试开始:执行gdb [exefilename] ,进入gdb调试程序,其中exefilename为要调试的可执行文件名

## 以下命令后括号内为命令的简化使用,比如run(r),直接输入命令 r 就代表命令run

$(gdb)help(h)	# 查看命令帮助,具体命令查询在gdb中输入help + 命令

$(gdb)run(r)	# 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)

$(gdb)start		# 单步执行,运行程序,停在第一行执行语句

$(gdb)list(l) 	# 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数)

$(gdb)set		# 设置变量的值

$(gdb)next(n)   # 单步调试(逐过程,函数直接执行)

$(gdb)step(s)	# 单步调试(逐语句:跳入自定义函数内部执行)

$(gdb)backtrace(bt)	# 查看函数的调用的栈帧和层级关系

$(gdb)frame(f) 	# 切换函数的栈帧


$(gdb)info(i) 	# 查看函数内部局部变量的数值

$(gdb)finish	# 结束当前函数,返回到函数调用点

$(gdb)continue(c)	# 继续运行

$(gdb)print(p)	# 打印值及地址

$(gdb)quit(q) 	# 退出gdb

$(gdb)enter(回车) 	# 再次执行上一次的命令
$(gdb)break+num(b)			# 在第num行设置断点

$(gdb)info breakpoints (i b)	# 查看当前设置的所有断点

$(gdb)delete breakpoints num(d)	# 删除第num个断点

$(gdb)display				# 追踪查看具体变量值

$(gdb)undisplay				# 取消追踪观察变量

$(gdb)watch					# 被设置观察点的变量发生修改时,打印显示

$(gdb)i watch				# 显示观察点

$(gdb)enable breakpoints	# 启用断点

$(gdb)disable breakpoints	# 禁用断点

$(gdb)x						# 查看内存x/20xw 显示20个单元,16进制,4字节每单元

$(gdb)run argv[1] argv[2]	# 调试时命令行传参

$(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())
重点掌握 参数

【实战】GDB命令行调试

#include <iostream>
using namespace std;

int main(int argc,char **argv)
{
    int N = 100;
    int sum = 0;
    int i = 1;

// calculate sum from 1 to 100
    while (i <= N)
    {
        sum = sum + i;
        i = i + 1;
    }

    cout << "sum = " << sum << endl;
    cout << "The program is over."   << endl;

    return 0;
}

1、进入调试模式 :         执行gdb [exefilename]   

2、给指定行打断点和显示断点信息实验

用到了 break、info breakpoints 命令

3、小练习:line 13打断点,查看几次 i的值

用到了 break、run、print、continue、display、回车

4、查看以断点行 为中心的前后 n 行代码

list n

 学习参考:

02-gdb调试基础指令_哔哩哔哩_bilibili

linux下gdb调试方法与技巧整理_gbd 调试opengausa-CSDN博客

4.1 常用调试命令参数_哔哩哔哩_bilibili

展望:

随着技术发展,已经可以通过本地可视化GDB 通过ssh远程 服务器进行可视化代码调试了:

一文掌握vscode远程gdb调试_vscode gdb调试-CSDN博客

VsCode + gdb + gdbserver远程调试C++程序_vscode 远程调试 gdb_cuijiecheng2018的博客-CSDN博客 通过vscode进行嵌入式linux arm开发板gdb调试_arm gdb 和vscode关联-CSDN博客

嵌入式 程序调试之gdb+gdbserver+vscode可视化调试_gdb可视化-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值