2014年6月25日 星期三

GDB基本操作指令

前言

之前工作debug都是使用IDE的除錯功能,就是設中斷點,然後執行,再一直點下一步,然後觀查參數的變化和在那裏發生錯誤,當然如果對開發專案的程式和架構愈熟悉的話,大概看一下Log就知道問題在那裏了。

不過最近必須開發伺服器上的C++的程式,而我都是在本機上用Notepad++寫完之後,上傳到伺服器上,用make指令進行編譯,基本上是沒辦法本機使用IDE來進行除錯的。

這樣就不用debug了嗎?當然不…,一個簡單的方法就是加log,不過只在修改程式碼不多,或是錯誤在特殊狀況出現在使用,要不然可能會被搞到瘋掉吧,一個因難的方法就是,在server上搞出一個IDE的畫面出來,理論上應該灌上桌面程式再加上遠端程式,然後放上支援Linux的IDE(如Eclipse和CodeBlock),不過不用這個方法的理由蠻多的,需要花時間研究這些東西,然後搞了半天也不一定可行,重點是把server搞掛了,可能要去喝西北風了吧…

不過,還是有一條路線可以走,那就是使用gdb(用小寫因為指令就是小寫XD),這讓我想到了MUD的遊戲,感覺真的很古早味…,在習慣了隨時可以看到code來除錯後,真的需要一點時間來習慣,需要習慣使用最強的IDE來把自已的code顯示出來,就是your brain,中文翻成你的豬腦或是魚腦,好了廢話不多說了,下面簡單的記錄一些常用的指令。



操作指令

  • Sample Code
大概隨便寫一套代碼來做範例…,檔名為Test.cpp
void function foo(int a) {
    count << a << endl;
}

int main() {
    int a;
    foo(a);
    return 0;
}
  • Compile
然後我們需要非常麻煩的下指令來compile程式,當程式愈來愈複雜時,可能就需要使用make指令的功能了,當我們使用g++(或是gcc,基本上可以做到的事情是一樣的,但還是存在一些差異,比較建議.cpp的程式用g++,.c的程式用gcc,但混用的清況的話,最好研究一下再使用)進行compile時,需要將加入-g的參數
g++ -g -o Test Test.cpp

  • 啟動gdb
好了,現在檯面上已經蓋滿了陷阱卡了,該是發動gdb的時候了,上吧!gdb~~
如果不能用的話,可能沒有安裝…
gdb ./Test
再來程式會自動進入gdb的操作介面,不過也可以直接下gdb,然後進行操作畫面再決定要除錯的程式,不過這個比較複雜,需要的時候再進行研究,下面參考資料有其相關的教學。

  • 設定breakpoint
設定中斷點,看你要把中斷點設在那,有二種方法,一個是按照行數,一個是使用函數名稱。
使用行數,停在foo(a);。
b 7
使用函數名稱。
b foo

  • 執行程式
設定完成後就可以正式執行程式了,如果如果下main的參數的話,可以直接下在r後面(也可以以使用set args your_parameters)。
r [your parameters]

  • 流程控制
當到達中斷點後,畫面會在跳回gdb的操作畫面,我們可以在這種決定下一步要如何作,主要使用三個指令n、s、c。
執行本行程式,然後移至下一行。
n
和n類似,但當執行該行程式為函數時,會進入函數中,追踨函數的程式。
s
繼續執行,直到下個中斷點或是程式結束。
c

  • 查詢資訊
一些顯示資訊的方法。
顯示變數,一次性的。
p parameter
Back trace,就是列出stack function(目前程式的堆疊關係),加上full會再印出各個函數的變數。
bt
bt full
顯示變數,當執行n時,都會顯示該變數的內容。
display your_parameter
顯示變數的資訊,也可以指定要顯示那個顯示變數的資訊,num是指定對象的代號。
info display [num]
中斷點資訊,也可以指定要那個中斷點的資訊。
info b [num]

  • 啟動、關閉、删除功能
在設定中斷點和顯示變數後,可以利用Disable將其功能關閉,可以指令要關閉的對象,當不指定時,為全部關閉。
disable display [num]
disable b [num]
再利用Disable關閉後,可以再利用Enable將其功能再度開啟。
enable display [num]
enable b [num]
而確定不需要再使用時,可以用delete將該功能移除。
delete display [num]
delete b [num]

  • Signal Handle
當發生錯誤時產生,可能是本身的錯誤,或是呼叫外部程式時產生,此時會產生各種的Signal,此時gdb會中斷,感覺就好像走路走到一半突然有人伸出一隻腳把你拌倒…,想要略過這些訊息的話,可以進行設定…
可以先查詢可Signal目前的設定
info handle
修改signal handle的設定,看要不要停止,或是印出相關資訊,這裏以SIGUSR為例
handle SIGUSR nostop noprint

結語

這篇主要是針對單一程式和執行緒來進行除錯,需要對多檔案或是執行緒,下面的參考資料有些資料可以參考,因為目前還用不到所以沒有進行整理,可能未來有一天會寫吧…,但用我的最強IDE來跑多檔案和執行緒感覺蠻容易混亂的 囧rz

參考資料:
http://www.study-area.org/goldencat/debug.htm
http://blog.csdn.net/dashuliu/article/details/4363450
http://blog.yslin.tw/2012/08/gdb.html
https://www.youtube.com/watch?v=Z6zMxp6r4mc
http://tetralet.luna.com.tw/?op=ViewArticle&articleId=187&blogId=1

沒有留言:

張貼留言