使用gdb調試遊戲服務器

前言

談論gdb重要性

通常來講。提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_num
code

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還有更好的調試經驗,我但願你能夠分享!






相關文章
相關標籤/搜索