GDB调试学习心得

Gdb是一款强大的调试工具,虽然没有图形化界面但是,其功能却更加强大

一个调试案例tst.c

#include<stdio.h>

int fun(int n)
{
	int sun=0;
	for(int  i=0;i<n; ++i)
	{
		sum+=1;
	}
	return sum;
}

int main()
{
	int i=0;
	long result=0;
	for(i =1;i<=100;++i)
	{
		result += i;
	}
    printf("result[1-100] = %d\n",result);
    printf("result[1-250] = %d\n",fun(250));
 }

使用gdb进行调试,要注意再编译生成可执行文件的时候的格式:

gcc -g tst.c -o tst //一定要注意加上参数 ‘ -g ’

调试命令

//启动gdb
gdb tst    <-----------启动gdb
(gdb)l    <-------------l命令相当于list,从第一行列出源码
 (gdb)    <------------直接回车,重复上一次的命令
 (gdb) break 16 <----------------设置断点,在源程序第16行处
 (gdb)break fun <----------------设置断点,在函数fun的入口处
 (gdb)info break <----------------查看断点信息
 (gdb)r    <-----------------运行程序,run命令简写
 (gdb)n  <------------------单条语句执行,next命令简写
 (gdb)c  <------------------继续运行程序,continue命令的简写
 (gdb)p  i   <----------------打印变量i的值,printf命令简写
 (gdb)bt   <-----------------查看函数堆栈

一般来说GDB调试的C/C++的程序,首先在编译时,我们必须把调试信息加到可执行文件中去,使用‘-g’参数就可以到达这一点。

基本上有以上这些常用的命令就足够我们平时的编译操作了。

随着工作难度的不断深入,随之而来的是之前总结的GDB调试经验已经不足以应对了,学会更多的操作方式有利于更好地发现程序当中的错误;

shell <command string>  <-----------可以调用unix的shell来执行command命令
make <make-agrs>    <--------------可以在gdb中使用make重新build自己的程序
set args        <---------可指定运行时参数
show args       <-----------可以查看设置好的运行参数
path <dir>       <----------可以设定程序的运行路径
set environment varname [=value] <-----设置环境变量
show environment   <-----------查看环境变量

调试已经运行的程序

在程序运行的过程中,可以通过进程号进入GDB调试,首先通过ps aux | grep "要调试的进程名"找到进程号,然后通过:

gdb -p 进程号    <-----------开始调试进程

设置观察点

观察点一般来观察某个表达式(变量也是一种表达式)的值是否发生了变化,如果变化了,马上停住程序:
设置观察点的几种方法:

watch <expr>            <---------------为表达式(变量)expr设置一个观察点,当表达式的值有变化时马上挺住程序
rwatch <expr>          <----------------当表达式被读时马上停住程序
awatch <expr>-----------当表达式被读或者被写时马上挺住程序
info watchpoints         <--------------列出当前所设置了的所有观察点

设置捕捉点

可以设置捕捉点来捕捉程序运行时的一些时间。

catch <event>  <----------当event发生时,停住程序。event可以是下面的内容:
1. throw 一个C++抛出的异常。(throw为关键字)
2catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值