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 查看程序奔溃时的堆栈信息