首页 > 代码库 > gdb学习(二)[第二版]
gdb学习(二)[第二版]
查看执行时数据
print - 查看变量值
ptype – 查看变量类型
#ptype i
#ptype “aaa” 打印字符串”aaa”的类型
#ptype array 打印数组array的类型
#ptype main 打印main函数的类型
print array – 查看数组
#p arr1
#p arr1[2] 查看数组arr2第三个元素值
#p &arr1[2] 打印数组元素的地址
#p &arr1 打印数组首地址。与p &arr1[0]作用相似
print *array@len – 查看动态内存
#p *arr2@10
#p *arr2@15 #将数组越界之后的内存也打印出来了
#p *arr@10 #静态的数组也能够改方式打印
#p arr[2]@2 #从arr[2]開始的两个元素
#p arr@2 #打印两个数组
print x=5 – 动态改变执行时数据
#print i = 1000
程序错误
编译错误:编敲代码的时候没有符合语言规范导致编译错误【语法错误】。
执行时错误:编译器检查不出这样的错误。但在执行的时候可能会导致程序崩溃【如:内存地址非法訪问】。
逻辑错误:编译和执行都非常顺利,可是执行结果不正确
gdb调试逻辑错误
//演示样例-实现逆序输出字符串hello。可是却没有不论什么输出 #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]; //Error:应该是reverse_str[4-i]... printf("%s\n", reverse_str); return 0; }
gdb调试段错误
段错误是因为訪问非法地址而产生的错误。
1、訪问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址指针赋值
2、内存越界(数组越界。变量类型不一致等) 訪问到不属于你的内存区域
//演示样例 #include <stdio.h> #include <stdlib.h> void segfault1() { int *p = NULL; *p = 100; } void segfault2() { char buf[1] = "a"; buf[13] = ‘A‘; printf("%c\n",buf[13]); } void segfault3() { char buf[1] = "a"; buf[10] = ‘A‘; printf("%c\n",buf[10]); } int main() { segfault1(); // segfault2(); // segfault3(); return 0; }
where命令 or bt命令:栈回溯,显示导致段错误的执行函数树
wh命令查看程序代码窗体
core文件调试
1、core文件
在程序崩溃时,通常会生成一个文件叫core文件。
core文件记录的是程序崩溃时的内存映像,并增加调试信息。core文件生成的过程叫做core dump
2、设置生成core文件
ulimit -c #查看core-dump状态
ulimit -c 数字 (如:ulimit -c 1024)
ulimit -a #用于查看当前全部状态信息
将ulimit -c unlimited写入~/.bashrc,则默认会生成core文件
3、gdb利用core文件调试
gdb 程序名 [core-file] #如:gdb bugging core
gdb学习(二)[第二版]