GDB attach 除錯
阿新 • • 發佈:2019-01-02
手賤寫個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
,如下圖
- 可以嘗試一些基本操作,如:
- 我想實現兩點:
-
- 列印count的值,這個很容易實現,利用
p
(單次列印) 或display
(多次列印) 均可實現。
- 列印count的值,這個很容易實現,利用
-
- 希望程式一直執行,這個用到了
command
命令:
在11行設定一個斷點,斷點編號為5,執行command 5
- 希望程式一直執行,這個用到了
> p count #列印 count 的值
> c #continue
> end #結束command的輸入
此時執行info b
可以看到,在斷點5下多了兩行命令。
執行c
:
此時程式就會在斷點5處中斷,執行p count
,然後執行c
直到下次觸發中斷。
不過,這樣也不是我想要的,目前不知道什麼原因,這樣的實現方式只能執行9次,如下圖
這只是減少了工作量,可還需要人為干預。之後又嘗試了silent
:
實現效果:
依舊需要人為干預,難受。。。
先到這吧,後期有什麼再補充。