通常來講。提gdb,命令用於調試。「命令」,用戶是幾乎相同的複雜話。而事實確實如此,實際的開發調試必須用到gdb。less
現在。大多數Linux系統是存在於server其中。函數
咱們想操做這些系統時,一般是經過Terminal來操做。也就是說這些Linux系統不具備圖形界面。而調試通常分兩部分。開發時調試和執行時調試。oop
當咱們的程序部署到Linux上時。那就需要忘記那該死圖形調試器了。spa
昨天公司遊戲的當中服務端崩潰了。我在調試時忘記了gdb命令-_-!(固然最後我是找出這個Bug了)。所以寫這篇博文加深記憶。同一時候分享一下經驗。.net
注:gdb遠不止這麼少的命令
1. attach: 用gdb調試一個正在執行中的進程
gdb <program> PID 或 gdb attach PID調試
2. br: 設置斷點
br filename:line_numcode
br namespace::classname::func_nameserver
3. n: 單步跳過 s: 單步進入blog
4. finish:運行到函數retun返回教程
5. list: 列出當前位置以後的10行代碼。list line_number: 列出line_number以後的十行代碼
6. bt(backtrace):列出調用棧(同類型的還有where,經驗告訴我。當你想列出堆棧信息時,而發現沒有效果,最好兩個命令都試試)
7. info locals:列出當前函數的局部變量
8. p var_:打印變量值
9. info breakpoints:列出所有斷點
10. delete breakpoints:刪除所有斷點;delete breakpoints id:刪除編號爲id的斷點。disable/enable breakpoints id:禁用/啓用斷點
11. break ... if ... 條件中斷
如下我主要講述的是執行時調試。
#include <stdio.h> void Crash() { int *a; *a = 1; printf("%d\n", *a); } void EndlessLoop() { int i = 1; int j = 0; while (i) { ++j; } } int main() { Crash(); // 崩潰 EndlessLoop(); // 死循環 return 0; }
http://blog.csdn.net/yitouhan/article/details/17175113 這是我以前寫的一篇關於防止崩潰的文章。
這裏用到core文件:
在一個程序崩潰時,它一般會在指定文件夾下生成一個core文件。
core文件不過一個內存映象(同一時候加上調試信息),主要是用來調試的。
這個core的文件名稱一般是core.PID,即core.3745等等
我一般會在/etc/security/limits.conf(Centos)設置Linux對core的支持。這需要從新啓動系統,以後就會永久支持打印core文件。
加入如下命令
* soft core unlimited
* hard core unlimited
意思是軟件和硬件都打印core文件,而且是unlimited(無限制)。
這裏可以將unlimited替換成指定的大小。
注:還有其餘的一些設置方式,可以自行上網搜索查詢。
就在此時。服務端test崩潰了。
在個人工做文件夾中發現了core.1234這個文件(core文件默認輸出到工做文件夾)。
輸入gdb test core.1234進入gdb調試。
這時再輸入where查看堆棧信息,例如如下圖:
看到這些信息,不要告訴我還找不到出錯的地方吧?!
當咱們發現死循環的時候不要停止進程。若是進程ID是1234
輸入命令 gdb attach 1234
你會發現gdb會斷點在死循環的地方,或許可能不是很是清楚,你可以一直輸入n。
注意行號。你會發現這就是出現死循環的地方。
再輸入where,來查看堆棧信息,例如如下圖所看到的。
看到這些信息,不要告訴我還找不到出錯的地方吧?。
半死循環(這是我本身用的一個名詞,不知道其餘教程等是否有使用)就是在執行的時候出錯,致使循環了幾百萬次、幾千萬次甚至幾億次的一種Bug。
儘管這樣的Bug相對於崩潰的相對小的數目和死循環的危險,但很是難以調試。假設你有一個這樣的Bug還有更好的調試經驗,我但願你能夠分享!