1.查看運行時的數據
- print 查看變量值
- ptype 查看類型
- print array 查看數組,查看數組,是查看的是靜態數組
- print *array@len 查看動態內存,查看動態數組,靜態數組都可以
- print x=5 改變運行時的數據
- eg:
p arr1
這裏數組名是打印整個數組的元素
p &arr1
打印數組的地址
p *arr2@10
查看內存的10個元素
p arr2[2]@2
查看內存包含第二個元素,2號,3號元素打印出來
p arr1@2
arr1是一個整體,2表示打印兩個數組,總共20個數組打印出來
- eg代碼:
05\02\simple.c
#include <stdio.h>
#include <stdlib.h>
long func(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<argc; i++)//argc:參數的個數
{
printf("%s ", argv[i]);//打印參數列表
}
printf("\n");
long result = 0;
for (i=1; i < 100; i++ )
{
result += i;
}
printf("result[1-100] = %ld\n", result);
printf("result[1-10] = %ld\n", func(10));
printf("Exiting main ...\n");
return 0;
}
long func(int n)
{
long sum = 0;
int i;
for (i = 1; i <= n; i++)
{
sum += i;
}
retuen sum;
}
- eg結果:
2.程序錯誤
- 編譯錯誤
編寫程序的時候沒有符合語言規範導致的編譯錯誤 - 運行時錯誤
編譯器檢查不出這種錯誤,但在運行時可能會導致程序崩潰;
eg:非法地址訪問 - 邏輯錯誤
編譯和運行都很順利,但是程序沒有幹它該乾的事情
3.gdb調試邏輯錯誤
- 因爲第一個字符串是\0,因爲字符串的輸出是以\0爲標記的,所以後面的字符串沒有輸出
olleh應該向前推一格,也就是說第一個輸入的字符下標應該爲4,所以應該改成reverse_str[4-i] - eg:測試代碼
05\02\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];
printf("%s\n", reverse_str);
return 0;
}
//這個程序實現逆序輸出字符串hello,但是卻沒有任何輸出
- eg:測試結果
改完後的結果如下:
4.gdb調試段錯誤
-
段錯誤是由於訪問非法地址而產生的錯誤
(1)訪問系統數據區,尤其是往系統保護的內存地址寫數據。最常見就是給一個0地址的指針寫入數據
(2)內存越界(數組越界,變量類型不一致等)訪問到不屬於你的內存區域 -
eg:測試代碼
05\02\bugging.c
#include <stdio.h>
#include <stdlib.h>
void segfault()
{
int *p = NULL;
*p = 100;
}
int main(void)
{
// segfault();//段錯誤產生原因1,給一個零地址的指針寫入數據
//段錯誤產生2:訪問越界的內存
char buf[1]="a";
buf[10003] = 'A';
printf("%c\n", buf[1003]);
return o
}
5.core文件調試
-
core文件
在程序崩潰時,一般會生成一個文件叫core文件。
core文件記錄的是程序崩潰時的內存映像,並加入調試信息。
core文件生成的過程叫做core dump。 -
設置生成的core文件
(1)ulimit -c 查看core-demp狀態
(2)ulimit -c 數字(eg,ulimit -c 1024)
(3)ulimit -c unlimited -
gdb利用core文件調試
(1)gdb 文件名 core文件
(2)bt -
eg:測試代碼:05\02\bugging.c
-
core文件使用的測試大致定位過程: