GDB本地调试

1.GDB 介绍
GDB(the GNU Project Debugger)是 GNU 发布的一个功能强大的 UNIX 程序调试工具,可以调试 Ada、 C、 C++、 Objective-C 和 Pascal 等多种语言的程序,可以在大多数 UNIX 和Microsoft Windows 变种上运行。 GDB 既可以在本地调试,也可以进行远程调试,这里主要记录本地调试的笔记,远程调试将会在下一篇进行说明。

GDB 可以在命令行下启动,通过命令行对程序进行调试; GDB 也有自己的图形前端,如 DDD。无论通过何种方式启动 GDB,通过 GDB 能够对程序进行如下调试:
● 运行程序,还可以给程序加上某些参数,指定程序的行为。
● 使程序在特定的条件下停止。
● 检查程序停止时的运行状态。
● 改变程序的参数,以纠正程序中的错误

2. GDB 基本命令
需要使用 GDB 调试的程序,在编译的时候必须加-g 参数,开启调试信息。运行 GDB,调试程序通常使用如下方式:
 

GDB 常用的基本命令
命令功能描述
break设置断点:break + 要设置断点的行号
clear清除断点:clear + 要清除断点的行号
delete用于清除断点和自动显示的表达式的命令
disable让所设断点暂时失效
enable与disable相对
run运行调试程序
continute继续执行正在调试的程序
next执行一行代码,但不进入函数内部
step执行一行代码,而且进入函数内部
list列出源代码的一部分
printprint + 变量名:输出该变量名的值
watchwatch + 变量名:监视一个变量的值
quit退出
kill终止调试程序

3.GDB 调试范例
编写hello_error.c,这里取名error,是因为这是一个bug的源文件

#include <stdio.h>


int *p = NULL;
void hello_print(void)
{
    printf("hello world");
}

int main(int argc,char *argv[])
{
    hello_print();
    *p = 10;//error
    return 0;
}

1.编译输出带调试信息的可执行文件,这个文件通常会比一般情况下生成的可执行文件的大,因为-g 输出的文件是包含很多调试参数在里面。

gcc -g hello_error.c -o hello_error1
gcc hello_error.c -o hello_error2

2.我们先运行一下hello_error1

./hello_error1

从调试信息中我们发现,出现内存段错误,原因是我们给指针p赋值,这个是指针是野指针,指向的是0地址,现在我们给0地址赋值,所以出现了错误。

我们使用gdb来调试这个程序:

gdb hello_error1

输入help,可查看相应的帮助信息。

输入 run 命令,开始调试程序

然后就停止在了错误的地方

我们也可以输入where命令,来定位问题:

很明显在源文件14行出现了问题

我们输入list命令,查看下源文件代码

我们先在13行打个断点 break 13,然后输入run,重新运行,然后程序就会运行到第13行,停止

然后输入step,进入hello_print函数体,然后在输入next,执行下一步,输出hello world

打印输出p

print p

给非法地址赋值,导致段错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值