linux下gdb的使用

什么是GDB

GDB(GNU Debugger)是GNU组织发布的代码调试工具。可以在win、linux、mac os下使用。

本文记录gdb在日常开发中常用命令和常用用法。

想要使用gdb调试代码,那么编译代码的时候必须带-g选项,让目标代码中携带调试信息,否则不能使用gdb调试。这是前提条件。

如何使用gdb调试一个程序。

man手册给出了三种方法:
第一种:调试可执行文件,gdb program,也就是gdb + 目标文件,比如调试目标文件名test的程序:gdb test
第二种:调试core文件,gdb program core,也就是 gdb + 目标文件 + core文件。 比如:gdb test core。 当程序出现段错误的时候可以用这种方法取调试。可以直接定位到段错误的地点。
举个例子:

#include<stdio.h>
int main(int argc,char **argv)
{
	int i = 0;
	int *pbuffer = NULL;
	*pbuffer = i;
	return 0;
}

pbuffer 指针的值是NULL,当我们给pbuffer赋值的时候就会引发段错误,编译程序得到test目标文件。执行程序会报“段错误 (核心已转储)”错误,同时得到一个名为core的文件。再执行命令 gdb test core 去调试程序,如下图:
在这里插入图片描述直接指出了代码是在第几行引发的段错误,直接把行数都提示出来了,太牛了。例子中的测试程序一眼就能看到问题,但是当程序特别大的时候,就不容易看出,而使用gdb调试core文件定位段错误是一种不错的方法。
如果没有得到core文件怎么办
很可能是资源受限制了,用 ulimit -a 命令查看一下受限制的资源。

jack@jack-virtual-machine:~/C$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31574
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31574
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

再执行命令ulimit -c unlimited 设置为core file size 不受限。 就可以得到core文件了。
-c设置core file size,-d 设置 data seg size。上边的代码能看出使用 -c 选项。

第三种:调式一个正在运行的程序,后台方式运行一个程序,然后通过进程号去调式,执行命令 gdb -p 进程号。

gdb常用命令:

其实gdb 最常用的命令就10个左右吧。
run 命令,简写 r,功能是启动程序。
break命令,简写b,功能是设置断点,最常用的有两种设置断点的方法:
第一种是通过行号设置断点,比如:b 6 是在第6行设置断点,但是有个疑问是在哪个文件的第6行设置断点呢,因为我们要调试的程序往往有若干个文件,答案是在程序正在运行的文件内设置断点。不过最好不要这样写,而是明确的指出在哪个文件的第几行设置断点。如下图
在这里插入图片描述
第二种是通过函数设置断点,b 函数名,比如:b out_put_array
在这里插入图片描述
是在函数内部的第一行设置断点。
delete命令,简写d,删除断点,比如:d 2 就是删除第2个断点。
在这里插入图片描述
disable命令:禁用断点 ,比如:disable 2 就是禁用第二个断点。
在这里插入图片描述
continue 命令,简写c,功能是继续全速运行程序,当程序遇到断点,或在单步执行的时候,c 命令会让程序全速跑起来。
list命令,简写 l,列出代码。和break命令类似,是从哪个文件的第几行列出代码。
在这里插入图片描述
print 命令,简写p,打印变量的值,或其它信息。这个可能是最常用的命令之一,
在这里插入图片描述
step 命令,跳进某一个函数执行。 注意step 跳进去就会执行,只到遇到断点。
help命令,help加命令就可以查看gdb命令的帮助信息。
暂且先记录这么几个命令吧。
注意:在gdb中可以调用shell 命令,比如:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值