1. 程式人生 > >GDB attach 除錯

GDB attach 除錯

手賤寫個bug,索性看看gdb。


首先寫個簡單的多執行緒小程式用於測試:

#include <pthread.h>           
#include <stdio.h>             
#include <unistd.h>
void *function(void *p)        
{
        unsigned int count = 0;
        while(1)               
        {                      
                printf("In function: %d\n\n", count);
                sleep(1);      
                count++;       
#if 0
                if(count == 5) 
                {
                        int * a = NULL;
                        (*a)++;
                }
#endif
        }
}

#if 1
int main()
{
        pthread_t thread;
        pthread_create(&thread, NULL, function, NULL);
        //pthread_join(thread, NULL);   
        
        unsigned int main_count = 0;    
        while(1)
        {
                printf("In main: %d\n", main_count);
                sleep(1);
                main_count++;
        }
        printf("main return \n");       
        return 0;
}
#endif

基本的gdb操作不在此贅述,以下是attach 實錄:

  • 在編譯原始碼的時候切記加 -g 選項,否則 執行 list冒出個No symbol table is loaded

  • 編譯完成後執行即可,執行./exe(exe是我重新命名後的可執行程式)
    在這裡插入圖片描述

  • 執行ps -ef | grep exe獲取 exe pid
    在這裡插入圖片描述

  • 執行gdb+attach 29708,其中29708是上圖中exe的pid
    在這裡插入圖片描述

  • 左側為exe執行輸出,此時執行中斷,等到attach 的 gdb 命令列給指令,比如我執行n,如下圖

在這裡插入圖片描述

  • 可以嘗試一些基本操作,如: 在這裡插入圖片描述
  • 我想實現兩點:
    1. 列印count的值,這個很容易實現,利用p(單次列印) 或 display(多次列印) 均可實現。
    1. 希望程式一直執行,這個用到了command命令:
      在這裡插入圖片描述
      在11行設定一個斷點,斷點編號為5,執行command 5
      在這裡插入圖片描述
> p count		#列印 count 的值
> c				#continue
> end			#結束command的輸入

此時執行info b可以看到,在斷點5下多了兩行命令。
執行c
在這裡插入圖片描述
此時程式就會在斷點5處中斷,執行p count,然後執行c直到下次觸發中斷。

不過,這樣也不是我想要的,目前不知道什麼原因,這樣的實現方式只能執行9次,如下圖
在這裡插入圖片描述
這只是減少了工作量,可還需要人為干預。之後又嘗試了silent
在這裡插入圖片描述
實現效果:
在這裡插入圖片描述
依舊需要人為干預,難受。。。


先到這吧,後期有什麼再補充。