最新 | 最热门 | 最高评价

+0  断点单步跟踪是一种低效的调试方法

Tag: 调试
云风 发于 2018年05月08日 14:21 | 点击: 699 | 展开摘要
断点单步跟踪的交互式调试器是软件开发史上的一项重大发明。但我认为,它和图形交互界面一样,都是用牺牲效率来降低学习门槛。本质上是一种极其低效的调试方法。

我在年少的时候( 2005 年以前的十多年开发经历)都极度依赖这类调试器,从 Turbo C 到 Visual C++ ,各个版本都仔细用过。任何工具用上十年后熟能生巧是很自然的事。我认为自己已经可以随心所欲用这类工具高效的定位出 bug 了。但在 2005 年之后转向跨平台开发后,或许是因为一开始没能找到 Linux 平台

查看全文: http://www.udpwork.com/item/16827.html

+0  LoadLibrary 无法加载 DLL 的 bug 处理

Tag: Windows | 调试
云风 发于 2018年03月15日 10:40 | 点击: 817 | 展开摘要
今天我们的小伙伴在把 Open Asset Import Library 封装成 lua 库的时候遇到一些麻烦。他在 vs 集成环境中编译的版本可以用,在 mingw-gcc 下却出错,报告 “找不到指定的模块。” 或是 “找不到指定的程序。" 。

我不得不吐槽,微软真是太有钱了,雇了一大帮人把出错信息都给国际化,这叫中国程序员怎么 google 问题啊。不太懂 windows ,反正我用 export LANG= 切换了 locale 为 C 还是不能把这段用 Forma

查看全文: http://www.udpwork.com/item/16723.html

+0  Direct3D12 的接口设计 bug

Tag: 调试
云风 发于 2017年09月21日 12:16 | 点击: 1060 | 展开摘要
昨天被 D3D12 的一个 bug 坑了一晚上,这个问题很值得一写。

最初是发现 LUID ID3D12Device::GetAdapterLuid() 这个函数有问题。我用 mingw64 gcc 编译后的程序,只要调用了一个 api ,d3d12device 设备对象的虚函数表就被破坏掉了。下一次对这个设备的任何 api 调用都会 crash 掉。

由于这个函数的实现在 d3d12.dll 中,是没有源码的,所以只能用 gdb 调试了一下。发现了一个问题:这个 api

查看全文: http://www.udpwork.com/item/16426.html

+0  Lua 5.3.4 的一个 bug

Tag: lua与虚拟机 | 调试
云风 发于 2017年08月24日 10:55 | 点击: 990 | 展开摘要
昨天我们一个项目发现了一处死循环的 bug ,经过一整晚的排查,终于确认是 lua 5.3.4 的问题。

起因是最近项目中接入了我前段时间写的一个库,用来给客户端加载大量配置表格数据 。它的原理是将数据表先转换为 C 结构,放在一块连续内存里。在运行时,可以根据需要提取出其中用到的部分加载都虚拟机中。这样做可以极大的提高加载速度。项目在用的时候还做了一点点小修改,把数据表都设置成 weaktable ,可以让暂时不用的数据项可以回收掉。

正式后面这个小修改触发了 bug

查看全文: http://www.udpwork.com/item/16393.html

+0  Lua 5.3.4 的一个 bug

Tag: lua与虚拟机 | 调试
云风 发于 2017年08月16日 10:18 | 点击: 1020 | 展开摘要
昨天我们一个项目发现了一处死循环的 bug ,经过一整晚的排查,终于确认是 lua 5.3.4 的问题。

起因是最近项目中接入了我前段时间写的一个库,用来给客户端加载大量配置表格数据 。它的原理是将数据表先转换为 C 结构,放在一块连续内存里。在运行时,可以根据需要提取出其中用到的部分加载都虚拟机中。这样做可以极大的提高加载速度。项目在用的时候还做了一点点小修改,把数据表都设置成 weaktable ,可以让暂时不用的数据项可以回收掉。

正式后面这个小修改触发了 bug

查看全文: http://www.udpwork.com/item/16386.html

+0  浮点运算潜在的结果不一致问题

Tag: 调试
云风 发于 2017年07月25日 10:56 | 点击: 877 | 展开摘要
昨天阿楠发现了项目中的一个 bug ,是因为浮点运算的前后不一致导致的。明明是完全相同的 C 代码,参数也严格一致,但是计算出了不相同的结果。我对这个现象非常感兴趣,仔细研究了一下成因。

原始代码比较繁杂。在弄清楚原理后,我简化了出问题的代码,重现了这个问题:

static void
foo(float x) {
float xx = x * 0.01f;
printf("%d\n", (int)(x * 0.01f));
printf("%d\n

查看全文: http://www.udpwork.com/item/16360.html

+0  epoll 的一个设计问题

Tag: skynet | 调试 | 语言与设计
云风 发于 2017年05月28日 11:17 | 点击: 1012 | 展开摘要
问题的起因是 skynet 上的一个 issue ,大概是说 socket 线程陷入了无限循环,有个 fd 不断的产生新的消息,由于这条消息既不是 EPOLLIN 也不是 EPOLLOUT ,导致了 socket 线程不断地调用 epoll_wait 占满了 cpu 。

我在自己的机器上暂时无法重现问题,从分析上看,这个制造问题的 fd 是 0 ,也就是 stdin ,猜想和重定向有关系。

skynet 当初并没有处理 EPOLLERR 的情况(在 kqueue 中似乎没

查看全文: http://www.udpwork.com/item/16280.html

+0  用 gdb 分析 coredump 的一些技巧

Tag: 调试
云风 发于 2017年05月08日 16:49 | 点击: 861 | 展开摘要
前几天我们正在运营的一款产品发生了崩溃,我花了两天尝试用 gdb 分析了 coredump ,虽然最后还是没能找到 bug ,但还是觉得应该做一些总结。

产品是基于 skynet 开发的,由于历史原因,它基于的是 skynet 1.0 之前 2015 年中的一个版本,由于这两年一直没出过什么问题,所以维护人员懈怠而没有更新。

崩溃的时候,关于 Lua 部分的代码缺少调试符号信息,这加大了分析难度。现在的 skynet 在编译 lua 时,加入了 -g 选项,这应该可以帮助

查看全文: http://www.udpwork.com/item/16256.html

+0  skynet 服务的沙盒保护

Tag: skynet | 调试
云风 发于 2016年05月07日 10:20 | 点击: 924 | 展开摘要
昨天我们新的 MMO 游戏第一次上线小规模测试,暴露了一些问题。

服务器在开服 3 小时后,突然内存暴涨,CPU 占用率提升不多。当时 SA 已经收到报警邮件,但刚巧在午餐时间,而游戏功能还正常,耽误了半个小时。处理不够及时,导致在最终没有能收集到足够在线数据前,服务器已不能正常操作。另外,忘记配置 core dump 文件输出是另一个原因。

在最后几分钟,我们收集到一些信息:某个 lua 服务陷入 C 代码中的死循环,在 skynet 控制台发 signal 无法中断它

查看全文: http://www.udpwork.com/item/15465.html

+0  opengl bug 一则

Tag: 调试
云风 发于 2016年02月18日 22:27 | 点击: 1019 | 展开摘要
这是个老问题,但是公司不同的同学先后被坑,所以必须记录一笔。这样可以增加事后被 google 到的概率,千万别来第三次了。

我原本以为 opengl 在 bind VBO 后,如果修改了 VBO 的数据,是不需要重新 bind VBO 对象的。所以早先的 ejoy2d 在这里的处理就做了一点优化,并没有重复 bind ,可以减少一些 API 调用。

大约在 2015 年 6 月左右,由于需要跟进 mac osx 的系统更新,ejoy2d 增加了对 VAO 的支持。我再修改

查看全文: http://www.udpwork.com/item/15167.html

+0  一个内存泄露 bug

Tag: skynet | 调试
云风 发于 2015年08月21日 15:09 | 点击: 1139 | 展开摘要
起因是 skynet 的一个 Issue ,同时,这两天我们正在开发的一个项目也反应貌似有内存泄露。

我觉得两件事同时发生不太正常,就决定好好查一下。

其实在 skynet 里查内存泄露要比一般的项目容易的多。因为 skynet 天生就分成了很多小模块,叫作服务。模块申请的内存是独立的,内聚性很高。模块的生命期比整个进程短的多,模块的规模也不会太大,可以独立分析。一般说来,如果有内存申请没有归还,应该是 C 模块里的 bug 。而 skynet 会用到的 C 模块也很少,

查看全文: http://www.udpwork.com/item/14502.html

+0  谈谈陌陌争霸在数据库方面踩过的坑(芒果篇)

Tag: 调试 | 游戏开发
云风 发于 2014年03月05日 11:01 | 点击: 1432 | 展开摘要
我们公司开始用 mongodb 并不是因为开始的技术选型,而是我们代理的第一款游戏《 狂刃 》的开发商选择了它。这款游戏在我们代理协议签订后,就进入了接近一年的共同开发期。期间发现了很多和数据库相关的问题,迫使我们熟悉了 mongodb 。在那个期间,我们搭建的运营平台自然也选择了 mongodb 作为数据库,这样维护人员就可以专心一种数据库了。

经过一些简单的了解,我发现国内很多游戏开发者都不约而同的采用了 mongodb ,这是为什么呢?我的看法是这样的:

游戏的需求

查看全文: http://www.udpwork.com/item/11802.html
|<<<12>>>| 一共2页, 23条记录