Linux开发工具之gdb(下),linux开发工具gdb


三、gdb调试(下)01.查看运行时数据print - 查看变量值ptype - 查看类型print array - 查看数组print *array@len - 查看动态内存print x =5 - 改变运行时数据#vi simple.c#include<stdio.h>long fun(int n);int main(int argc,char *argv[]){ int i; int x = 5; double z = 2.5; char ch  = 'q';  int arr1[] = {0,1,2,3,4,5,6,7,8,9}; int *arr2 = (int *)malloc(sizeof(int)*10); for(i=0;i<10;i++) { arr2[i] = i; } printf("Entering main ...\n"); for(i=0;i<argc;++i) { printf("%s ",argv[i]); } printf("\n"); long result = 0; for(i=1;i<100;++i) { result += i; } printf("result[1-100] = %d\n", result); printf("result[1-10] = %d\n",func(10)); printf("Exiting main ...\n"); retuln 0;}02.gdb调试逻辑错误#vi reverse.c#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[5-i]改为reverse_str[4-i]) printf("%s\n",reverse_str); return 0;}:wq#make#./reversehello(空,出错的原因:单步调试在循环完成后,查看reverse_str的结果,p reverse_str,结果是"\000olleh",而打印时以"\0"开头,所以停止。#make clean#make#./reverse03.gdb调试段错误  段错误是由于访问非法地址而产生的错误。    访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个指针以0地址;    内存越界(数组越界,变量类型不一致)访问到不属于你的内存区域#vi bugging.c#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]); return 0;}#./bugging.c段错误Starting program: /home/study/cppcourse/devtool/06gdb/buggingProgram received signal SIGSEGV,Segmentation fault.(gdb)bt(栈回溯)#0 0x12345678 in segfault () at bugging.c:7#1 0x12345678 in main() at bugging.c:12#2 0x12312312 in __libc_start_main() from /lib/tls/llibc.so.604.core文件调试  core文件 在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump  设置生成core文件 ulimit -c 查看core-dump状态 ulimit -c 数字(如:ulimit -c 1024) ulimit -c unlimited  gdb利用core文件调试 gdb文件名core文件 bt#ulimit -c0(表示无法查看core文件的名)#./bugging.c段错误(core dumped)#ulimit -a core file size (blocks size) 0#lscore.9351#gdb bugging core.9351……(gdb)bt(查看栈回溯信息)gdb总结  查看运行时数据  程序错误  gdb调试逻辑错误  gdb调试段错误  core文件

相关内容