三、gdb調試(下)01.查看運行時數據print - 查看變數值ptype - 查看類型print array - 查看數組print *array@len - 查看動態記憶體print x =5 - 改變運行時數據#vi simple.c#include<stdio.h>long fun(int
三、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文件