使用gdb调试游戏服务器

前言

谈论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还有更好的调试经验,我希望你可以分享!





时间: 2024-10-16 17:01:35

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

用gdb调试游戏服务端

前言 说说gdb的重要性 一般来说,提到gdb,都是用命令来调试."命令",这个对于用户来说几乎等同于繁杂的词语.尽管事实确实如此,但实际的开发调试必须用到gdb.现在,大多数Linux系统是存在于服务器当中.我们想操作这些系统时,一般是通过Terminal来操作.也就是说这些Linux系统不具有图形界面.而调试一般分两部分,开发时调试和运行时调试.当我们的程序部署到Linux上时,那就需要忘记那该死图形调试器了. 说说写这篇文章的目的 昨天公司游戏的其中服务端崩溃了.我在调试时忘记了

使用 GDB 调试多进程程序

GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 ([email protected]), 软件工程师, IBM中国软件开发中心 2007 年 7 月 30 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大.对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统: 进程

游戏服务器

服务分架构很多游戏公司不是web架构都是自己开发的CS端,因为游戏交互强而web架构只支持C->S的单工. 一般的网站应用程序,是典型的Request-Response模式,通过tcp和服务器建立一次链接,而请求数据和影响数据通过http协议进行组装,当完成一次交互的时候,服务器端和客户端tcp链接就会释放,把服务器端socket资源留给新的客户端.通常web程序是比较好扩展的,通过硬件负载均衡和添加web服务器来实现,这一套方案业界都已经比较成熟了.网游比较特殊,最大的特点在于客户端和服务器端

java游戏服务器搭建

一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简单的测试用的注册登陆功能. 服务器工程---GameServer 测试客户端---TestClient,模拟客户端与服务器通信,用于测试服务器功能 项目工具 ---Tools,服务器搭建用到的jar包以及相关eclipse插件 二.服务器运行环境 此服务器是基于tomcat启动,所以GameServ

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

引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展, 这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚, 出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现.真实的情况是, Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子.头发纷乱的芬兰小子长大,然后一决高下. 李纳斯赢得了自己

使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?和C Socket服务器比起来有什么优劣?可行性怎么样? 从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方平台验证. 到编写独立工具导表工具GitHub - davyxu/tabtoy: 跨平台的高性能便捷电子表格导出器. 以及网络库GitHub - davyxu/cellnet: 简单,方便,高效的Go语言的游戏服务器底层. 最终使用这些工具及库编写整个游戏服务器框架, 我的感受是很不错的 细节看来,

第02课:启动GDB调试

使用GDB调试程序一般有三种方式: gdb filename gdb attach pid dgb filename corename 也对应这本节课的核心内容: 直接调试目标程序 附加进程 调试core文件 接下来我们逐一讲解. 2.1直接调试目标程序 在开发阶段或者研究别人的项目时,当编译成功生成目标二进制文件后,可以使用gdb filename直接启动这个程序的调试,其中filename是需要启动的调试程序文件名,这种方式是直接使用GDB启动一个程序进行调试.注意这里说的启动一个程序进行调

GDB调试系列之了解GDB

想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.Mac OSX等系统上的跨平台调试器,允许我们查看另一个程序在运行过程中内部发生了什么——或者另一个程序崩溃时在做什么. 具体而言,GDB能做以下四种事情[1],以帮助我们定位运行中的Bug: 让程序开始运行,指定任何可能影响其行为的内容. 让程序在特定条件下停止运行. 检查程序停止运行时发生了什么.

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.