(P5)Linux開發工具——gdb入門下

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文件使用的測試大致定位過程:
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章