--gdb入门(下)
八、查看运行时数据
print-查看变量值
ptype–查看变量类型
#ptype i
#ptype “aaa”
#ptype arr1 打印数组arr1的类型
print array –查看数组
#p arr1
#p arr1[2]
#p &arr1[2] 打印数组元素的地址
#p &arr1 打印数组首地址,与p&arr1[0]作用相同
print *array@len –查看动态内存
#p *arr2@10
#p *arr2@15 #将数组越界之后的内存也打印出来了
#p arr[2]@2
print x=5 –动态改变运行时数据
#print i = 1000
九、程序错误
编译错误:编写程序的时候没有符合语言规范导致编译错误【语法错误】。
运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃【如:地址非法访问】。
逻辑错误:编译和运行都很顺利,但是程序没有干它该干的事情。
十、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]; //应该是reverse_str[4-i]... printf("%s\n", reverse_str); return 0; } //这个程序要实现逆序输出字符串hello,但是却没有任何输出。
十一、gdb调试段错误
段错误是由于访问非法地址而产生的错误。
1、访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址指针赋值
2、内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域
示例:
#include <stdio.h> #include <stdlib.h> void segfault() { int *p = NULL; *p = 100; } void segfault2() { char buf[1] = "a"; buf[13] = 'A'; printf("%c\n",buf[13]); } int main() { segfault(); // segfault2(); return 0; } // bt命令 #栈回溯
十二、core文件调试
1、core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做coredump
2、设置生成core文件
ulimit -c #查看core-dump状态
ulimit -c 数字 (如:ulimit-c 1024)
ulimit -c unlimited
ulimit -a #用于查看当前所有状态信息
3、gdb利用core文件调试
gdb 文件名 core文件 #如:gdbbugging core
bt #栈回溯