一般來說,提到gdb,都是用命令來除錯。「命令」,這個對於使用者來說幾乎等同於繁雜的詞語。儘管事實確實如此,但實際的開發除錯必須用到gdb。現在,大多數linux系統是存在於伺服器當中。我們想操作這些系統時,一般是通過terminal來操作。也就是說這些linux系統不具有圖形介面。而除錯一般分兩部分,開發時除錯和執行時除錯。當我們的程式部署到linux上時,那就需要忘記那該死圖形偵錯程式了。
昨天公司遊戲的其中服務端崩潰了。我在除錯時忘記了gdb命令-_-!(當然最後我是找出這個bug了)。因此寫這篇博文加深記憶,同時分享一下經驗。
注:gdb遠不止這麼少的命令
1. attach: 用gdb除錯乙個正在執行中的程序
gdb pid 或 gdb attach pid
2. br: 設定斷點
br filename:line_num
br namespace::classname::func_name
3. n: 單步跳過 s: 單步進入
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 void crash()
void endlessloop()
} int main()
這是我之前寫的一篇關於防止崩潰的文章。
這裡用到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,來檢視堆疊資訊,如下圖所示。
看到這些資訊,不要告訴我還找不到出錯的地方吧?!
用gdb除錯遊戲服務端
一般來說,提到gdb,都是用命令來除錯。命令 這個對於使用者來說幾乎等同於繁雜的詞語。儘管事實確實如此,但實際的開發除錯必須用到gdb。現在,大多數linux系統是存在於伺服器當中。我們想操作這些系統時,一般是通過terminal來操作。也就是說這些linux系統不具有圖形介面。而除錯一般分兩部分,...
遊戲服務端開發 一
資料儲存伺服器 遊戲中的資料大致分為靜態配置資料和動態的玩家資料。這裡主要討論玩家資料儲存的解決方案。雖然遊戲應用的寫操作要多於讀操作,但是加入快取層仍然有其必要性。多個應用伺服器啟動時從資料庫讀取資料會在瞬間給資料庫造成巨大壓力,如果將相對靜態的資料以檔案的形式放在應用伺服器本地,可以避免這個問題...
遊戲服務端開發 二
應用伺服器的設計 上 應用伺服器的工作有 0 同步廣播玩家的行為 1作為第三方對玩家個體和玩家之間互動行為計算,並將計算結果推送到資料儲存系統 2驅動遊戲中的 npc 3作為乙個特殊的遊戲參與者,與玩家相互作用。應用伺服器最重要的工作莫過於同步廣播玩家之間的行為,使玩家之間能夠互視,多人同時遊戲才有...