前言

谈论gdb重要性

一般来说。提gdb,命令用于调试。“命令”,用户是几乎相同的复杂话。而事实确实如此,实际的开发调试必须用到gdb。

如今。大多数Linux系统是存在于server其中。

我们想操作这些系统时,通常是通过Terminal来操作。也就是说这些Linux系统不具有图形界面。而调试一般分两部分。开发时调试和执行时调试。

当我们的程序部署到Linux上时。那就须要忘记那该死图形调试器了。

说说写这篇文章的目的

昨天公司游戏的当中服务端崩溃了。我在调试时忘记了gdb命令-_-!(当然最后我是找出这个Bug了)。因此写这篇博文加深记忆。同一时候分享一下经验。

基础命令

注:gdb远不止这么少的命令

1. attach: 用gdb调试一个正在执行中的进程

gdb <program> 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 <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,来查看堆栈信息,例如以下图所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWl0b3VoYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

看到这些信息,不要告诉我还找不到出错的地方吧?。

半死循环

半死循环(这是我自己用的一个名词,不知道其他教程等是否有使用)就是在执行的时候出错,导致循环了几百万次、几千万次甚至几亿次的一种Bug。

尽管这样的Bug相对于崩溃的相对小的数目和死循环的危险,但非常难以调试。假设你有一个这样的Bug还有更好的调试经验,我希望你可以分享!




使用gdb调试游戏服务器的更多相关文章

  1. Centos环境下部署游戏服务器-编译

    游戏服务器是在windows环境开发的,相关跨平台的东西在这里不谈了,只谈如何将Visual Studio 工程转换到Linux下编译.这里涉及到的软件分别为:Centos版本为6.4,Visual ...

  2. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  3. GDB调试:Linux开发人员必备技能

    开篇词:Linux C/C++ 开发人员要熟练掌握 GDB 调试 大家好,我是范蠡,目前在某知名互联网旅游公司基础框架业务部技术专家组任开发经理一职. 本系列课程的主题是 Linux 后台开发的 C/ ...

  4. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  5. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  6. Linux+eclipse+gdb调试postgresql源码

    pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...

  7. Scut游戏服务器免费开源框架-3

    Scut游戏服务器免费开源框架--快速开发(3) Scut快速开发(3) 1        开发环境 需要安装的软件 a)        消息队列 b)        数据库,Sql2005以上版本 ...

  8. Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计

    前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...

  9. gdb调试嵌入式环境搭建

    1.下载gdb源代码 http://ftp.gnu.org/gnu/gdb/ 2.编译 解压#tar zxvf gdb-7.9.1.tar.gz,cd到解压的目录中. 2.1编译arm-linux-g ...

随机推荐

  1. 功能间(两个form)数据交互的编程方法

    功能间数据交互的编程方法 现在框架具有在两个打开的功能之间进行通讯的机制.通讯是指,一个功能调用另外一个功能的方法,或者传递一些数据,并得到返回结果.比如处置单打开结算单,结算单保存后,将结算单号反填 ...

  2. export和import实现模块化

    export和import实现模块化 阅读目录 ES6的模块化的基本规则或特点: 下面列出几种import和export的基本语法: ES6导入的模块都是属于引用: 循环依赖的问题: 浏览器兼容: 参 ...

  3. Rfc2898DeriveBytes解密如何通过java实现

    原文 Rfc2898DeriveBytes解密如何通过java实现 这个找了半天,还是不太懂,密码一点不懂,直接上来问了 Rfc2898DeriveBytes对应的是PBKDF2WithHmacSHA ...

  4. Oracle多实例的配置方法

    SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME /dbhome_2) (PROGRAM ...

  5. Codeforces 468D Tree

    题目 给出一棵带边权的树,求一个排列\(p\),使得\(\sum_{i=1}^{n}{dis(i, p_i)}\)的值最大,其中\(dis(v, u)\)表示\(v\)到\(u\)的距离. 算法 这题 ...

  6. 《C++ Primer Plus》学习笔记1

    C++ Primer Plus>学习笔记1 第二章.開始学习C++ 1.控制符endl 假设显示字符串时,在字符串中包括换行符,而不是在末尾加上endl,这样能够大大降低输入量:假设是要生成一个 ...

  7. PHP - 验证用户名

    /** * * 函数名:_check_username($user_str,$min_num,$max_num); * 作用:检测用户名是否符合格式 * 参数: * 1:用户名 * 2:不得小于多少位 ...

  8. 2783: [JLOI2012]树( dfs + BST )

    直接DFS, 然后用set维护一下就好了.... O(nlogn) ------------------------------------------------------------------ ...

  9. VC++编程之字符串解惑--Unicode & MBCS

    VC++中的字符串用起来着实让人难受,LPTSTR.LPCTSTR.LPCSTR.LPCWSTR.LPSTR.WCHAR.CString._T()和L彼此之间的互相转换更是头痛.根据使用经验和MSDN ...

  10. 基于visual Studio2013解决面试题之1403插入排序

     题目