前言
之前工作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
void function foo(int a) { count << a << endl; } int main() { int a; foo(a); return 0; }
- Compile
g++ -g -o Test Test.cpp
- 啟動gdb
如果不能用的話,可能沒有安裝…
gdb ./Test再來程式會自動進入gdb的操作介面,不過也可以直接下gdb,然後進行操作畫面再決定要除錯的程式,不過這個比較複雜,需要的時候再進行研究,下面參考資料有其相關的教學。
- 設定breakpoint
使用行數,停在foo(a);。
b 7使用函數名稱。
b foo
- 執行程式
r [your parameters]
- 流程控制
執行本行程式,然後移至下一行。
n和n類似,但當執行該行程式為函數時,會進入函數中,追踨函數的程式。
s繼續執行,直到下個中斷點或是程式結束。
c
- 查詢資訊
顯示變數,一次性的。
p parameterBack trace,就是列出stack function(目前程式的堆疊關係),加上full會再印出各個函數的變數。
bt bt full顯示變數,當執行n時,都會顯示該變數的內容。
display your_parameter顯示變數的資訊,也可以指定要顯示那個顯示變數的資訊,num是指定對象的代號。
info display [num]中斷點資訊,也可以指定要那個中斷點的資訊。
info b [num]
- 啟動、關閉、删除功能
disable display [num]disable b [num]
再利用Disable關閉後,可以再利用Enable將其功能再度開啟。
enable display [num] enable b [num]而確定不需要再使用時,可以用delete將該功能移除。
delete display [num] delete b [num]
- Signal Handle
可以先查詢可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
沒有留言:
張貼留言