调试器:gdb
三大特点:
1、
启动被调试的程序
2、
设置断点、单步执行
3、
查看变量的值
调试步骤
gcc -g sum.c -O sum
gdb sum
操作:
quit退出gdb
list显示代码
查看源代码:
gdb+可执行文件±-tui
layout split(c语言和汇编语言同时看,每行代码对应汇编)
layout asm(显示汇编)
layout src(显示源码)
断点:
break+行号(打断点,再输入run执行到断点行)
break+行号+条件
break+函数名
info break(查看断点信息)
delete+断点编号(删除断点)
disable+断点编号(让断点关闭)
enable+断点编号(让断点打开)
clear+行号(清除这行的断点)
运行命令:
run:运行程序
next,step:单步执行(next不会进入子函数,step进入子函数)
continue:继续运行直到程序结束(再次遇到新的断点还会停止)
练习:
Finish
执行完当前的函数。
until
这个用于执行完循环。在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体到后面的一个语句停下。
如何调用函数
Watch
可设置观察点(watchpoint)。使用观察点可以使得当某表达式的值发生变化时,程序暂停执行。
执行该命令前,必须保证程序已经运行
Display
display命令查看参数的值,可以使用disable,enable,delete,info命令修改及查看其状态,用法与对断点的一样。
作业
如何使用dgb调试段错误
GDB段错误调试
所谓段错误就是对内存的非法访问
采用GDB调试段错误有2种方法
1.在GDB中运行目标程序,当发生段错误时,GDB中运行的程序会自动停下来
2.直接运行目标程序,使其在发生段错误时产生内存转储(core dump)文件,GDB对该文件进行调试
abort.c
#include <stdio.h>
#include <stdlib.h>
void recurse(void)
{
static int i;
if( ++i == 3)
abort();
else
recurse();
}
int main(int argc,char ** argv){
recurse();
}
gcc -g -o
abort abort.c
使用gdb调试
Line number 15 out of
range; abort.c has 14 lines.
(gdb) r
Starting program: /mnt/hgfs/www/c/gcc/abort
Program received signal SIGABRT, Aborted.
0x000000333a232495 in raise (sig=6) at …/nptl/sysdeps/unix/sysv/linux/raise.c:64
64
return INLINE_SYSCALL
(tgkill, 3, pid, selftid, sig);
(gdb) bt
#0 0x000000333a232495 in raise (sig=6) at
…/nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x000000333a233c75 in abort () at abort.c:92
#2 0x00000000004004e7 in recurse () at
abort.c:8
#3 0x00000000004004ec in recurse () at
abort.c:10
#4 0x00000000004004ec in recurse () at
abort.c:10
#5 0x0000000000400502 in main (argc=1, argv=0x7fffffffe528) at abort.c:13
显示在recurse函数调用了3次后调用了abort函数,产生段错误
内存错误工具