gdb入门

gdb是GNU debugger的缩写,是编程调试工具。
gdb的功能:
1.启动程序,可以按照用户自定义的要求随心所欲的运行程序。
2.可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。
3,当程序停住时,可以检查此时程序中所发生的事。
4.动态改变量程序的执行环境。

1.运行程序

run(r) 运行程序
run arg1 arg2 …

注意:run可以简写为 r

2.查看源码

命令 含义
list(l) 查看最近10行源码
list fun 查看fun函数源码
list file:fun 查看file文件中的fun函数源码
list 1,20 查看1-20行的代码
list ,20 查看10-20行的代码
list ,-1 查看倒数10行的代码

3.设置断点

break(b) 行号
break fun
break file:行号
break file:fun
break if <condition> - 条件成立时程序停住。
info break(i b) - 查看断点
watch expr - 当表达式expr值发生改变,程序停住。
delete(d) n - 删除断点

4.单步调试

continue(c) -  	运行至下一个断点
step(s) - 		单步跟踪,进入函数,类似于VC中的step in
next(n) -		单步跟踪,不进入函数,类似于VC中的step out
finish - 		运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until - 		当厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

5.查看运行时数据

命令 含义
print(p) 查看变量值
ptype 查看类型
print array 查看数组
print *array@len 查看动态内存
print x=5 改变运行时数据

6.程序错误

编译错误:编写程序的时候没有符合语法规范导致编译错误。
运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃。
逻辑错误:编译和运行都很顺利,但是程序没有干它该干的事情。

7.gdb调试逻辑错误

#include <stdio.h>
int main(void)
{
        int i;  
        char str[6] = "hello";
        char reverse_str[6] = "";

        printf("%s\n", str);
        for (i=0; i<5; i++)
                reverse_str[5-i] = str[i]; 
        printf("%s\n", reverse_str);
        return 0;
}

这个程序要实现逆序输出字符串hello,但是却没有任何输出。
当运行到printf语句时,使用p reverser_str打印出"\000olleh",第一个字符是\000,自然无法输出后面的内容

8.gdb调试段错误

段错误是由于访问非法地址而产生的错误。
1.访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个指针以0地址
2.内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

#include <stdio.h>
#include <stdlib.h>

void segfault()
{
	int *p = NULL;
	*p = 100;
}

int main(void)
{
	segfault();        // 访问了系统数据区,运行时发生段错误
/*     内存越界,运行时发生段错误
	char buf[1] = "a";
	buf[10003] = 'A';
	printf("%c\n",buf[10003]);
*/
/*     注意:运行时不发生段错误,然而这段代码是非法的!这种bug隐晦
	char buf[1] = "a";
	buf[10] = 'A';
	printf("%c\n",buf[10]);
*/
	return 0;
}

9.core文件调试

1.core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump
2.设置生成core文件

命令 含义
ulimit -c 查看core-dump状态
ulimit -c 数字 设置保存core文件的盘块数量,如:ulimit -c 1024
ulimit -c unlimited 设置盘块数量为unlimited
hwg@hwg-virtual-machine ~/linux操作/gcc的使用/3.gdb $ 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) 3781
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) 3781
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

3.gdb利用core文件调试
gdb 可执行文件名 core文件
bt 查看程序奔溃时的堆栈信息

posted @ 2017-02-10 20:38  west000  阅读(287)  评论(0编辑  收藏  举报