1 使用 gdb 进行调试
gdb是一个功能很强大的调试器,它是一个自由软件,能够用在许多UNIX平台上。它同时也是Linux系统中的默认调试器。gdb已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.
目前有几种典型的调试和测试Linux程序的方法。一般做法是先运行程序并观察其输出结果,如果不能正常工作,就需要决定应该采取哪些措施。可以修改程序然后重新尝试(代码检查-试运行-出错法),也可以在程序中增加一些语句来获得更多关于程序内部运行情况的信息(取样法),还可以直接检查程序的执行情况(受控执行法)。程序调试可以分为如下5个阶段:
① 测试:找出程序中存在的缺陷或错误。
② 固化:让程序的错误可重现。
③ 定位:确定相关的代码行。
④ 纠正:修改代码纠正错误。
⑤ 验证:确定修改解决了问题。
1.1 gdb 常用命令
常见的调试程序的步骤如下:
gcc -g -o filename -Wall filename.c
gdb filename
l :显示代码(list)
b 4 :在第4行设置断点(breakpoint)
r :运行(run)
n :下一步不进入函数(next)
s :表示单步进入函数(step)
p i :打印变量i(print)
c :运行到最后(continue)
q :退出(quit)
1.2 gdb 命令调试列表
1.3 段错误
运行产生段错误( segmentation fault)而被终止,就说明操作系统向程序发送了一个信号,告诉程序操作系统检测到了非法的内存访问,为防止内存空间被破坏,操作系统提前终止了该程序的运行。
操作系统检测非法内存访问的能力,取决于它的硬件配置和它在内存管理实现方面的一些具体做法。在大多数系统中,操作系统分配给程序的内存一般都会比程序实际需要使用的大一些。如果非法内存访问出现在这部分内存区域内,硬件就可能检测不到,这就是并非所有版本的Linux和UNIX系统都会产生段错误的原因。
当程序运行的时候出现了段错误,使用gdb可以进行调试:
① 首先,可以使用 ulimit -a 来查看当前系统的各项属性的大小限制。
ulimit -a
② 再使用 ulimit -c unlimited 设置core file size 为不限制大小。
ulimit -c unlimited
③ 设置完毕后,可以通过 ulimit -a 来检查是否设置成功。
ulimit -a
④ 再次运行程序,会产生core文件,通过gdb可执行程序core文件,进行调试。直接通过bt可以看到程序段错误时的现场。
gdb ./file core