Linux程式設計之gdb(二)

海邊的某某某發表於2019-06-24

    想一想,自己寫的程式不會調,那也太難受了吧

自己在Windows程式設計的時候,介面化的調式都搞不定,還能做命令列的調式?相信我。Linuxgdb除錯比你想象的要好玩得多!!!!

 

在Linux中,gdb的除錯功能十分強大。在這裡可以安裝一個小外掛:wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh

#include<stdio.h>
#include<stdlib.h>

int add_num(int a,int b)
{
    printf("this is a test!");
    return a+b;
    
}



int main(int args,char*argv[])
{
    int a=12,b=13;
    pid_t pid;
    pid = fork();
    if(pid<0)
    {
        perror("fork");
        exit(1);
    }
    if(pid==0)
    {
        int c=add_num(a,b);
        print("%d+%d=%d",a,b,c);
        exit(1);
    }
    int c = b-a;
     int *d = &c;
     print("%d-%d=%d",b,a,*d);
     return 0;
}

這裡fork()是建立子程式。插入一下:子程式和父程式擁有同樣的程式碼段。也就是會有兩個程式來執行同一段程式碼。不過,子程式程式號pid在這個程式中是為0的。而父程式的pid是大於0的。這樣就可以區分了。pid==0是執行子程式,子程式在呼叫一個函式就退出了。而父程式會執行最後幾行程式碼。

  通過gdb ./gdb_test 啟動gdb 

 1. b 是打上斷點   b 程式碼行數 或者 b 函式名    檢視斷點資訊:info breakpoints     取消斷點:delete 斷點號 

 

1 l是檢視程式碼  用法與b一樣

3. 執行程式:r     執行下一行:n

4. 檢視變數的值:p   /d 是十進位制  

5. 多程式多執行緒除錯  :由於子程式和父程式執行不同的程式碼。先選擇跟著子程式執行 :set follow-fork-mode child     檢視有幾個程式:info inferiors     可以通過attach   程式號跟程式

6. 進入函式:s     快速完成函式:finish

7. 檢視棧空間:bt 

8.檢視堆:heap

9. 檢視地址 :x  /20 是檢視20個

 

 一點點gdb基礎,希望有所幫助。。

 

相關文章