在Ubuntu18.04中的程序代码的GDB调试

本文介绍了如何在Ubuntu18.04中使用GDB进行程序调试,包括安装、启动GDB,常用命令的使用,以及通过GDB解决内存出错问题的步骤。通过GDB调试实例,演示了如何定位和修复代码错误,强调了GDB在提升程序调试效率中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、GDB的使用

1、安装GDB

输入命令:

sudo apt-get install gdb

运行结果:
在这里插入图片描述

2、启动GDB

输入命令:

gdb

运行结果:
在这里插入图片描述

3、GDB的常用命令

命令结果
file装入想要调试的可执行文件
kill终止正在调试的程序
list列出产生执行文件的源代码的一部分
next执行一行源代码但不进入函数内部
step执行一行源代码而且进入函数内部
run执行当前被调试的程序
c继续运行程序
quit终止gdb
watch使你能监视一个变量的值而不管它何时被改变
backtrace栈跟踪,查出代码被谁调用
print查看变量的值
make使你能不退出gdb就可以重新产生可执行文件
shell使你能不离开gdb就执行UNIX shell命令
whatis显示变量或函数类型
break在代码里设断点,这将使程序执行到这里时被挂起
info break显示当前断点清单,包括到达断点处的次数等
info files显示被调试文件的详细信息
info func显示所有的函数名称
info local显示当函数中的局部变量信息
info prog显示被调试程序的执行状态
delete [n]删除第n个断点
disable[n]关闭第n个断点
enable[n]开启第n个断点
ptype显示结构定义
set variable设置变量的值
call name(args)调用并执行名为name,参数为args的函数
Finish终止当前函数并输出返回值
return value停止当前函数并返回value给调用者

4、GDB调试实例

  • 首先创建一个C语言文件test.c
touch test.c
vim test.c
  • 输入以下代码:
#include <stdio.h>
void ShowRevertNum(int iNum)
{
     while (iNum > 10)
     {
        printf("%d", iNum % 10);
        iNum = iNum / 10;
     }
     printf("%d\n", iNum);
}
int main(void)
{
     int iNum;
     printf("Please input a number :");
     scanf("%d", &iNum);
     printf("After revert : ");
     ShowRevertNum(iNum);
}

上面的代码可以逆序输出一个整型数,比如输入123,则输出321。

  • 使用gcc生成可执行文件并编译运行
gcc -o test1 test.c
./test1

运行结果:
在这里插入图片描述
可以看到,在输入100的时候输出结果是错误的

  • 下面开始用GDB进行调试
  • 进入gdb
gcc -o test1 -g test.c
gdb test1
  • 输入l查看代码
    运行结果:
    在这里插入图片描述
  • 下断点
    在这里插入图片描述
  • 发现问题
    在这里插入图片描述
    经过一步一步查看值的变化,发现iNum变成10了之后就不会再进入循环了,所以循环条件应该是大于等于10,我们要对错误进行修改,需要先退出gdb再进行对代码的修改。
  • 修改程序,解决问题
    在这里插入图片描述
    程序编译运行后,输入100,得到正确的结果

二、内存出错的GDB调试

Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。

  • 首先让Linux系统产生core文件
    新建一个C语言文件,输入以下代码:
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}

然后输入命令:

 ulimit –c 100

让系统产生core文件,运行程序,让程序崩溃,产生core文件,使用gdb配合core文件,定位问题

三、总结

通过对在Ubuntu下进行gdb调试,可以在检查程序的运行状态,帮助我们更好的了解自己程序的错误,提高效率,尽快解决错误。

### 配置 VS Code 支持 C 语言开发 在 Ubuntu 18.04 上配置 Visual Studio Code (VS Code) 作为 C 语言开发工具涉及多个步骤,包括安装必要的组件、配置编译器以及设置调试环境。 #### 安装 VS Code 和必要依赖 为了使 VS Code 能够支持 C 语言开发,需要先安装 VS Code 及其相关扩展。此外,还需要安装 GCC 编译器和 GDB 调试器来完成代码的构建与调试过程[^2]。 ```bash sudo apt update sudo apt install software-properties-common sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc gdb code ``` 上述命令会更新包列表并安装最新版的 GCC 编译器、GDB 调试器以及 VS Code 应用程序。 #### 安装 C/C++ 扩展 打开 VS Code 后,在扩展市场中搜索 **C/C++** 插件(由 Microsoft 提供),然后点击安装按钮将其添加到当前环境中[^4]。此插件提供 IntelliSense 功能、语法高亮显示以及其他增强功能,有助于提高编程效率。 #### 创建工作区文件夹结构 建议为项目建立清晰的工作目录布局以便于管理源码文件和其他资源项。例如: ```plaintext my_c_project/ ├── src/ # 存放 .c 文件的地方 │ └── main.c # 主入口函数定义在此处 └── build/ # 构建产物存放位置 ``` #### 设置 tasks.json 来指定构建任务 进入 `.vscode` 文件夹内新建名为 `tasks.json` 的 JSON 文件用于描述如何调用外部工具链执行实际编译操作。下面是一个简单的例子展示怎样利用 GNU Make 或直接通过 g++ 命令行参数实现自动化流程控制[^1]: ```json { "version": "2.0.0", "tasks": [ { "label": "build hello world", "type": "shell", "command": "/usr/bin/gcc", "args": [ "-g", "${workspaceFolder}/src/main.c", "-o", "${workspaceFolder}/build/hello" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] } ``` 这里 `-g` 参数表示生成调试信息;`${workspaceFolder}` 是动态占位符代表根路径;最后指定了输出可执行二进制的位置。 #### 配置 launch.json 实现断点跟踪分析能力 同样位于同一级下的另一个重要配置文档叫做 `launch.json` ,它决定了当按下 F5 键启动调试模式时具体应该加载哪个目标镜像以及附加其他选项等等细节: ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/hello", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build hello world", "miDebuggerPath": "/usr/bin/gdb" } ] } ``` 以上片段设置了默认运行的应用名称,并且关联了之前提到过的预处理脚本标签名 `"build hello world"` 。这样每次触发调试前都会重新刷新最新的改动成果再投入测试环节当中去验证逻辑正确与否。 --- ### 总结 综上所述,在 Ubuntu 18.04 平台上搭建完整的基于 VS Code 的 C 开发框架主要包括以下几个方面:首先是基础软件栈准备阶段即获取官方发行版本号对应的 IDE 版本及其配套服务端口监听进程守护机制等内容介绍完毕之后紧接着就是围绕特定领域需求定制专属解决方案的过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值