Ubuntu下程序代码的GDB调试


一、GDB调试是什么?

1.了解GDB

GDB : GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。
• GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编
写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可
运行于不同电脑。
• 使用GDB我们可以:
– 设置断点使程序停住
– 监视或修改程序中变量的值
– 跟踪代码执行过程

2.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给调用者

二、gdb调试举例

1.整型数的反转代码–找错

下面的代码实现对一个整型数的反转功能,比如输入123,则输出321。但输入100时,程序的输出结果却不正确,请找出问题。

(1)编写原代码

在这里插入图片描述

(2)为程序添加调试信息并启用gdb开始调试

//通过gcc的-g选项为程序添加调试信息
 gcc –o RevertNum –g RevertNum.c
// 启动gdb
gdb RevertNum
//显示代码及行号
l
//设置断点
b 16
b ShowRevertNum
//查看所有断点信息
info b
//执行程序
run
//查看变量iNum类型
whatis iNum 
//继续执行
c
//打印iNum的值
p iNum
//单步调试
c
//单步执行
n

在循环中,iNum为10时不再进入循环,应该包含10。如图出现错误。
在这里插入图片描述
修改程序,iNum>10改为iNum>=10。结果如下图所示:

在这里插入图片描述
到这里就修改成功啦!

2.段错误调试

(1)编写原代码

在这里插入图片描述

(2)段错误的调试

在这里插入图片描述
在这里插入图片描述
Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。
• 可按如下步骤生成和使用core文件
– Step 1: 让系统产生core文件
• ulimit –c num #设定core文件容量(num为数字,为0
是不产生core文件)
– Step 2: 运行程序,让程序崩溃,从而生成core文件
– Step 3: gdb配合core文件,定位问题
• gdb 程序名 core文件名
• 比如: gdb segDemo core
在这里插入图片描述

3内存出错的gdb调试

(1)编写原代码

利用core文件定位以下出错代码。

#include<stdio.h>
int main()
{
int *p=0;
*p=1;
return 0;
}

(2)内存出错下的调试

在这里插入图片描述
其他调试方法
• 利用printf + 条件编译,来辅助调试。
• 测试版:gcc –o mystrdup -DDEBUG
• 发布版:gcc –o mystrdup

总结

本文练习和总结了gdb调试的几种应用,调试在编写程序里至关重要,学起来学起来!

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页