GDB除錯正在執行的程式
阿新 • • 發佈:2019-01-10
有時會遇到一種很特殊的除錯需求,對當前正在執行的其它程序進行除錯(正是我今天遇到的情形)。這種情況有可能發生在那些無法直接在偵錯程式中執行的程序身上,例如有的程序 只能在系統啟動時執行。另外如果需要對程序產生的子程序進行除錯的話,也只能採用這種方式。GDB可以對正在執行的程式進行排程,它允許開發人員中斷程式 並檢視其狀態,之後還能讓這個程式正常地繼續執行。
一、多執行緒除錯
多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令:
-
info thread 檢視當前程序的執行緒。
-
thread <ID> 切換除錯的執行緒為指定ID的執行緒。
-
break file.c:100 thread all 在file.c檔案第100行處為所有經過這裡的執行緒設定斷點。
-
set scheduler-locking off|on|step,這個是問得最多的。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。
-
off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。
-
on 只有當前被除錯程式會執行。
-
step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。
-
這個問題超多。在GDB下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要GCC的配合。
在GCC編譯程式的時候,加上-ggdb3引數,這樣,你就可以除錯巨集了。
另外,你可以使用下述的GDB的巨集除錯命令 來檢視相關的巨集。
-
info macro – 你可以檢視這個巨集在哪些檔案裡被引用了,以及巨集定義是什麼樣的。
-
macro – 你可以檢視巨集展開的樣子。
1、首先獲得程式的PID
ps -ef | grep xxxxx2、進入除錯程式
- gdb attach PID